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

FBB*_*FBB 7 java concurrency

我有一个关于使用a Condition提供的内存障碍的问题Lock.

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

int putptr, takeptr, count;
Run Code Online (Sandbox Code Playgroud)

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

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

如果是,signal()调用时是否可见,或者在unlock()锁定时调用何时?

谢谢.

编辑:我在javadoc中看到Lock:

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

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

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

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

Joh*_*int 7

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

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

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

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