我在使用Condition
提供的Lock
时遇到有关内存障碍的问题。
关于the javadoc for Condition
中提供的示例,我对使用以下内容有疑问:
int putptr, takeptr, count;
这些属性不应声明为volatile吗?正如我从示例中理解的那样,线程可能看不到例如count
的修改。
或者是,当调用signal()
时,获取锁定后所做的所有修改都对其他线程可见?很像synchronized
块中的一些代码?
如果是,调用signal()
时,或锁定时调用unlock()
时,修改是否可见?
感谢。
编辑:我在Lock
:
所有Lock实现必须强制执行内置监视器锁提供的相同内存同步语义,如Java™语言规范的第17.4节所述:
- 成功的锁定操作与成功的锁定操作具有相同的内存同步效果。
- 成功解锁操作具有与成功解锁操作相同的内存同步效果。
不成功的锁定和解锁操作以及重入锁定/解锁操作不需要任何内存同步效果。
它们的意思是:“成功的锁定操作具有与输入synchronized
块相同的内存同步效果”,并且“成功的解锁操作具有与退出synchronized
块相同的内存同步效果“?
答案 0 :(得分:7)
您应该阅读它的方式是,lock.unlock
之前发生的所有写入对所有后续lock.lock
都可见。 await
一个被唤醒的线程基本上会lock.lock
。signal
。因此,自上次解锁以来发生的所有写入现在都可见。
or when unlock() is called on the lock
没有内存语义,因为后一点{I} {{1}}是正确的。
他们的意思是:“成功的锁定操作具有相同的内存 进入同步块的同步效果“和”A 成功的解锁操作具有相同的内存同步 效果退出同步块“?
是的,确切地说!更具体地说,编译器将发出monitorenter和monitorexit字节码指令。