在最近的回答中,我建议可以在包含我们需要的变量的对象上实现volatile
by的功能(asker 无权访问代码中的变量)。synchronizing
volatile
这让我想到我实际上不需要阻塞包含对象,我只需要实现内存屏障。由于同时synchronized
实现了同步和内存屏障,如果我需要的只是内存屏障(在这种情况下),那么使用它synchronized(new Object())
来实现我的内存屏障并确保永远不会争用锁会更好吗?
在最近的回答中,我建议可以在包含我们需要的变量的对象上实现volatile
by的功能(asker 无权访问代码中的变量)。synchronizing
volatile
这让我想到我实际上不需要阻塞包含对象,我只需要实现内存屏障。由于同时synchronized
实现了同步和内存屏障,如果我需要的只是内存屏障(在这种情况下),那么使用它synchronized(new Object())
来实现我的内存屏障并确保永远不会争用锁会更好吗?
正如这里所解释的:http ://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#synchronization synchronized(new Object()) 被认为是一个 noop 并且可以被完全删除编译器。你不会从中获得记忆障碍。
synchronized(new Object())
使用它来实现我的内存屏障并确保永远不会争用锁实际上会更好吗?
没有。JVM 可以很容易地证明这个锁不能被两个线程访问(因为它是一个线程局部变量)并且几乎肯定会把它变成一个空操作,即完全删除该synchronized
语句。
除了@assylias 的非常好的观点,还考虑到synchronized
规范没有实现内存屏障。只是这就是它在当今典型的 CPU 内存架构上实现的方式。该规范只保证当两个线程获得相同的锁时会发生什么。
无论如何,如果您不关心规范,而只关心现实世界的实现,那么为什么不引入您自己的volatile
变量并在需要内存屏障时简单地写入它呢?只要我们谈论的是您的想法所暗示的一组受约束的架构,您写信给哪个 都无关紧要。volatile
synchronized(new Object())