显式锁定是否自动提供内存可见性?

Tem*_*ing 13 java concurrency multithreading

示例代码:

class Sample{
    private int v;
    public void setV(){
        Lock a=new Lock();
        a.lock();
        try{
            v=1;
        }finally{
            a.unlock();
        }
    }
    public int getV(){
        return v;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我有一个线程不断调用getV而我只是在另一个线程中执行setV一次,那么读取线程是否保证在写入后立即看到新值?或者我需要使"V"易失或AtomicReference?

如果答案是否定的,那么我应该将其更改为:

class Sample{
    private int v;
    private Lock a=new Lock();
    public void setV(){
        a.lock();
        try{
            v=1;
        }finally{
            a.unlock();
        }
    }
    public int getV(){
        a.lock();
        try{
            int r=v;
        }finally{
            a.unlock();
        }
        return r;
    }
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 8

文档:

所有Lock实现必须强制执行内置监视器锁提供的相同内存同步语义:

  • 成功的锁定操作就像成功的monitorEnter操作一样
  • 成功的解锁操作就像成功的monitorExit操作一样

如果Lock 在两个线程中使用(即读取和写入),读取线程将看到新值,因为monitorEnter刷新缓存.否则,您需要声明变量volatile以强制读取线程中的内存读取.