【发布时间】:2014-08-12 21:25:33
【问题描述】:
我对 volatile 的理解是它确保始终从内存中读取值,因此据我所知,在以下示例中,myObject 变量需要是 volatile 以避免 NullPointerException 被提出:
private final Object lock = new Object();
private MyObject myObject = null;
//...
synchronized (lock) {
if (myObject == null) {
myObject = new MyObject();
}
myObject.blah();
// some other stuff that I want synchronized
}
myObject 只在同步块中被触及。 lock 仅用于同步该块。
对吗?
稍微改写一下,我的问题是……想象一下有两个线程正在访问该代码。第一个线程锁定并设置 myObject,调用 .blah() 和同步块中的任何其他代码并退出同步块。这允许线程二进入同步块。如果不将 myObject 设置为 volatile,它是否仍有可能将 myObject == null 评估为 true?
【问题讨论】:
-
myObject易变吗?另外,Object lockconstant 是否适用于您班级的所有实例? -
@LuiggiMendoza - 见编辑。
-
还有其他代码可以将
myObject设置为null吗? -
@SotiriosDelimanolis - 没想到这段代码是自包含的。
-
我认为可能有机会,我在使用
synchronized块时没有那么愉快的经历,其中发生了意外的结果并且同步不起作用,尤其是在进程开始时。最好使用ReentrantLock。而volatile在这种情况下与同步无关,所以不需要。