我知道 ReentrantLock 使用 AbstractQueuedSynchronizer ( AQS )来实现 Lock
但是实现的细节,我无法理解。

我知道 AQS 使用volatile, CAS 并旋转进行同步。但是,这些操作仅控制“状态”成员。

虽然, LockSupport.park LockSupport.unpark 可以同步线程的缓存行。
但是,如果从不存在争用,则永远不会调用 LockSupport 方法。
像这样:
1.Thread A的启动和运行

2.线程B的启动和运行

3.线程A:

lock.lock();
try{
  //modify some shared members
  ....
}finally{
  lock.unlock();
}

4.然后线程B:
lock.lock();
try{
  //read shared members
  ....
}finally{
  lock.unlock();
}

无争用,线程B不调用 LockSupport 方法。

lock.lock() CAS “state”成员,而 lock.unlock()将volatile“state”修改为0。

为什么线程B可以看到关于共享成员的线程A的修改?

为什么 ReentrantLock 可以用作“同步”?

我没有看到像 fullFence 这样的代码来同步内存。

哪些代码实现了线程的缓存行的同步?

谢谢!

最佳答案

CAS操作定义了事前发生的关系,因此Java内存模型保证了线程中的内存修改对于另一个线程是可见的。

09-28 07:20