Java 基于局部变量的同步
我注意到一个奇怪的结构:Java 基于局部变量的同步,java,multithreading,java-8,synchronized,concurrenthashmap,Java,Multithreading,Java 8,Synchronized,Concurrenthashmap,我注意到一个奇怪的结构: Node r=new ReservationNode(); 同步(r){ //... } 考虑到JIT最有可能将其视为不可操作,在本地对象上同步有什么意义?在代码获取对象的监视器之后,对对象的引用存储在选项卡中,该选项卡是全局可见的节点数组,构成ConcurrentHashMap的内容: Node<K,V> r = new ReservationNode<K,V>(); synchronized (r) { if (casTabAt(t
Node r=new ReservationNode();
同步(r){
//...
}
考虑到JIT最有可能将其视为不可操作,在本地对象上同步有什么意义?在代码获取对象的监视器之后,对对象的引用存储在
选项卡中,该选项卡是全局可见的节点数组,构成ConcurrentHashMap的内容:
Node<K,V> r = new ReservationNode<K,V>();
synchronized (r) {
if (casTabAt(tab, i, null, r)) {
Node r=new ReservationNode();
同步(r){
if(卡斯塔巴特(制表符,i,空,r)){
此时,在同一ConcurrentHashMap
上执行其他修改方法的其他线程在遍历全局数组时可能会遇到此不完整的节点,换句话说,节点
引用已转义
虽然在构建了ReservationNode
的点上,不可能对新创建的对象进行争用,但在其他方法中(在数组中找到的节点上进行同步),可能会对该节点进行争用
这就像“优先级同步”。创建者在引用尚未转义的点进行同步,因此它保证成功,而在引用转义的点,所有其他线程都必须等待,这是不可能的(但仍然可能的)如果他们在代码获取对象的监视器后立即访问该节点
,则对该对象的引用将存储到选项卡
,该选项卡是构成ConcurrentHashMap
内容的全局可见节点数组:
Node<K,V> r = new ReservationNode<K,V>();
synchronized (r) {
if (casTabAt(tab, i, null, r)) {
Node r=new ReservationNode();
同步(r){
if(卡斯塔巴特(制表符,i,空,r)){
此时,在同一ConcurrentHashMap
上执行其他修改方法的其他线程在遍历全局数组时可能会遇到此不完整的节点,换句话说,节点
引用已转义
虽然在构建了ReservationNode
的点上,不可能对新创建的对象进行争用,但在其他方法中(在数组中找到的节点上进行同步),可能会对该节点进行争用
这就像“优先级同步”。创建者在引用尚未转义的点进行同步,因此它保证成功,而在引用转义的点,所有其他线程都必须等待,这是不可能的(但仍然可能的)如果他们访问的是节点
,则该节点可能需要在野外执行一些对种族敏感的内务管理,而不仅仅是构造。@ratchet freak:正如类型名称ReservationNode
所示,该节点的存在主要是为了相互排除对同一散列桶的更新。这就是computeIfAbsent
的原子性保证要求:一旦开始计算,就不允许对同一密钥进行其他更新。@Holger我也有类似的同步问题,我在socket对象上使用同步,我试图看看是否可以完全取消同步通过其他一些有效的方式进行ot?想看看您是否能提供帮助。可能节点需要对野外环境进行一些种族敏感的内务管理,而不仅仅是构造。@ratchet freak:正如类型名称ReservationNode
所示,该节点的存在主要是为了相互排除对同一哈希buc的更新ket.ComputeFabSent
的原子性保证需要这样做:一旦开始计算,就不允许对同一密钥进行其他更新。@Holger我也有类似的同步问题,我在socket对象上使用同步,我正在试着看看是否可以摆脱同步一起还是不通过其他有效的方式?想看看你是否能帮上忙。