我知道 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内存模型保证了线程中的内存修改对于另一个线程是可见的。