synchronized的用例(new Object())

时间:2013-05-23 10:28:01

标签: java multithreading synchronization shared-memory

在最近的answer中,我建议可以通过volatile在包含我们需要的变量synchronizing的对象上实现volatile的功能(问问者)无法访问代码中的变量。

这让我觉得我实际上不需要阻止包含对象,我只需要实现内存屏障。当synchronized实现同步同步内存障碍时,如果我只需要内存屏障(如本例所示),那么使用{实际上更好{1}}实现我的记忆障碍确保锁永远不会争用?

3 个答案:

答案 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())就是无关紧要的。