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