在最近的answer中,我建议可以通过volatile
在包含我们需要的变量synchronizing
的对象上实现volatile
的功能(问问者)无法访问代码中的变量。
这让我觉得我实际上不需要阻止包含对象,我只需要实现内存屏障。当synchronized
实现同步和同步和内存障碍时,如果我只需要内存屏障(如本例所示),那么使用{实际上更好{1}}实现我的记忆障碍和确保锁永远不会争用?
答案 0 :(得分:3)
如此处所述:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#synchronization synchronized(new Object())被认为是noop,可以由编译器完全删除。你不会有内存障碍。
答案 1 :(得分:2)
使用
synchronized(new Object())
来实现我的内存障碍并确保锁永远不会争用真的会更好吗?
NOP。 JVM可以很容易地证明这个锁不能被两个线程访问(因为它是一个线程局部变量)并且几乎肯定会把它变成no-op,即完全删除synchronized
语句。 / p>
答案 2 :(得分:2)
除了@ assylias非常好的观点之外,还要考虑synchronized
没有通过规范实现内存屏障。只有这样才能在今天典型的CPU内存架构上实现它。规范只保证当两个线程获得相同的锁时会发生什么。
无论如何,如果你不关心规范,只关心实际的实现,那么为什么不引入你自己的volatile
变量,只要你想要一个内存屏障就可以写入它?只要我们谈论的是volatile
想法暗示的受限制的一组架构,那么 synchronized(new Object())
就是无关紧要的。