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
”?