7

Condition在使用 a提供的 a时,我有一个关于内存屏障的问题Lock

关于javadoc forCondition中提供的示例,我有一个关于使用的问题:

int putptr, takeptr, count;

这些属性不应该被声明为 volatile 吗?正如我从示例中所理解的那样,线程可能看不到例如count.

或者,当signal()被调用时,自获得锁以来所做的所有修改对其他线程都是可见的?很像一个synchronized块中的一些代码?

如果是,修改signal()是在调用时可见,还是在unlock()锁上调用时可见?

谢谢。

编辑:我在 javadoc 中看到Lock

所有 Lock 实现必须强制执行与内置监视器锁提供的相同内存同步语义,如 The Java™ Language Specification 的第 17.4 节所述:

  • 成功的锁定操作与成功的锁定操作具有相同的内存同步效果。
  • 成功的解锁操作与成功的解锁操作具有相同的内存同步效果。

不成功的锁定和解锁操作,以及重入锁定/解锁操作,不需要任何内存同步效果。

它们的意思是:“成功的锁定操作与进入synchronized块具有相同的内存同步效果”,以及“成功的解锁操作与退出块具有相同的内存同步效果synchronized”?

4

1 回答 1

7

您应该阅读它的方式是,在 a 之前发生的所有写入lock.unlock对所有后续lock.lock. 一个正在运行的线程await,当被唤醒时,基本上会做lock.lock。因此,自上次解锁以来发生的所有写入现在都将可见。

signal没有记忆语义,因为您的后一点状态是or when unlock() is called on the lock正确的。

它们的意思是:“成功的锁定操作与进入同步块具有相同的内存同步效果”,以及“成功的解锁操作与退出同步块具有相同的内存同步效果”?

对,就是这样!更具体地说,编译器将发出 monitorenter 和 monitorexit 字节码指令。

于 2013-03-10T02:34:13.367 回答