Java - 非最终字段上的同步

Bob*_*r02 3 java multithreading synchronization

如果在可以更改其引用的字段上进行同步,则如下所述:

class A {

    Object someObject;

    void method(){
        synchronized (someObject) {
              Object newObject = new Object();
              //possibly modify the old ref
              if(chackCondition()){
                   someObject = newObject;
              }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我担心这里可能会有一些奇怪的,低级的编译器优化,这可能让两个线程同时访问同步区域.任何评论都会得到很大的评价.

Mar*_*ers 8

你是绝对正确的.这个时刻newObject被暴露给其他线程作为新值someObject,那些其他线程现在使用完全不同的互斥锁,因此可以同时执行"互斥"代码.

一个常见的解决方案是只提供一个不同的互斥锁并同步:

private final Object someObjectMutex = new Object();
Run Code Online (Sandbox Code Playgroud)

  • @ Bober02你实际上并不知道; 没有共同的同步障碍,线程之间没有*发生之前*,特别是没有要求在最后一次分配之前的指令实际执行之前. (2认同)