Java 同步(新对象())的用例

Java 同步(新对象())的用例,java,multithreading,synchronization,shared-memory,Java,Multithreading,Synchronization,Shared Memory,在最近的一次会议上,我建议通过在包含变量的对象上进行同步,可以实现易失性的功能(asker无权访问代码中的变量) 这让我想到我实际上不需要在包含对象上阻塞,我只需要实现一个内存屏障。由于synchronized实现了同步和内存屏障,如果我只需要内存屏障(如本例中所示),那么使用synchronized(new Object())来实现我的内存屏障和确保锁永远不会被争用是否会更好 使用synchronized(newobject())来实现我的内存障碍并确保锁永远不会被争用,这样会更好吗 没有。J

在最近的一次会议上,我建议通过在包含变量的对象上进行
同步
,可以实现
易失性
的功能(asker无权访问代码中的变量)

这让我想到我实际上不需要在包含对象上阻塞,我只需要实现一个内存屏障。由于
synchronized
实现了同步内存屏障,如果我只需要内存屏障(如本例中所示),那么使用
synchronized(new Object())
来实现我的内存屏障确保锁永远不会被争用是否会更好

使用
synchronized(newobject())
来实现我的内存障碍并确保锁永远不会被争用,这样会更好吗

没有。JVM可以很容易地证明这个锁不能被两个线程访问(因为它是一个线程局部变量),并且几乎肯定会将它变成一个不操作,即完全删除
synchronized
语句。

如下所述:
synchronized(new Object())被认为是noop,编译器可能会完全删除它。你不会得到内存障碍。

除了@ AssiLIAS的很好的一点之外,还认为同步没有通过规范实现内存障碍。只有在这种情况下,它才是在当今典型的CPU内存体系结构上实现的。该规范仅保证当两个线程获得相同的锁时会发生什么


无论如何,如果您不关心规范,而只关心现实世界的实现,那么为什么不引入您自己的
volatile
变量,并在需要内存屏障时简单地写入它呢?只要我们讨论的是
synchronized(new Object())所隐含的一组受约束的体系结构,那么您向哪个
volatile
写入就无关紧要了
idea.

那么,在最小化/消除锁争用的同时,如何在不设置实际变量的情况下实现
volatile
这样的内存屏障呢?@OldCurmudgeon我在sun.misc包中看到了一些东西,但不确定它是在JDK 7还是8中(类似于:unsafe.load/unsafe.store)-现在无法找出它。我想得到的是什么-没有锁争用的内存障碍?我想这是我缺少的关键点-障碍只适用于特定锁对象的所有共享者。尽管关于这个主题的大多数讨论都提到刷新缓存,但是对于一个实现来说,仅仅将缓存值从一个cpu推送到另一个cpu是很有可能的。在这个问题中,asker想调用一个对象的
set…
方法,而他们无法从多个线程控制该对象。变量不能设置为volatile。是的,我希望随着执行单元(核心或其他)数量的增加,这种情况会发生。在大规模并行系统中,没有缓存一致性,我认为主流已经坚定地走上了这条道路。不幸的是,没有Java原语具有“内存屏障”的确切语义。对不起,我认为实际上,执行写操作的线程的所有动作对执行读操作的线程都是可见的——这非常接近于实际的内存障碍!另见: