内存屏障和java.util.concurrent.locks.Condition示例

时间:2013-03-10 02:22:25

标签: java concurrency

我在使用Condition提供的Lock时遇到有关内存障碍的问题。

关于the javadoc for Condition中提供的示例,我对使用以下内容有疑问:

int putptr, takeptr, count;

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

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

如果是,调用signal()时,或锁定时调用unlock()时,修改是否可见?

感谢。

编辑:我在Lock

的javadoc中看到了
  

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

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

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

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

1 个答案:

答案 0 :(得分:7)

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

or when unlock() is called on the lock没有内存语义,因为后一点{I} {{1}}是正确的。

  

他们的意思是:“成功的锁定操作具有相同的内存   进入同步块的同步效果“和”A   成功的解锁操作具有相同的内存同步   效果退出同步块“?

是的,确切地说!更具体地说,编译器将发出monitorenter和monitorexit字节码指令。