6

在最近的回答中,我建议可以在包含我们需要的变量的对象上实现volatileby的功能(asker 无权访问代码中的变量)。synchronizingvolatile

这让我想到我实际上不需要阻塞包含对象,我只需要实现内存屏障。由于同时synchronized实现同步内存屏障,如果我需要的只是内存屏障(在这种情况下),那么使用它synchronized(new Object())来实现我的内存屏障确保永远不会争用锁会更好吗?

4

3 回答 3

3

正如这里所解释的:http ://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#synchronization synchronized(new Object()) 被认为是一个 noop 并且可以被完全删除编译器。你不会从中获得记忆障碍。

于 2013-05-23T10:35:34.917 回答
2

synchronized(new Object())使用它来实现我的内存屏障并确保永远不会争用锁实际上会更好吗?

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

于 2013-05-23T10:32:17.957 回答
2

除了@assylias 的非常好的观点,还考虑到synchronized规范没有实现内存屏障。只是这就是它在当今典型的 CPU 内存架构上实现的方式。该规范只保证当两个线程获得相同的锁时会发生什么。

无论如何,如果您不关心规范,而只关心现实世界的实现,那么为什么不引入您自己的volatile变量并在需要内存屏障时简单地写入它呢?只要我们谈论的是您的想法所暗示的一组受约束的架构,您写信给哪个 都无关紧要。volatilesynchronized(new Object())

于 2013-05-23T10:38:02.190 回答