Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于局部变量的同步_Java_Multithreading_Java 8_Synchronized_Concurrenthashmap - Fatal编程技术网

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对象上使用同步,我正在试着看看是否可以摆脱同步一起还是不通过其他有效的方式?想看看你是否能帮上忙。