我知道AbstractQueuedSynchronizer(AQS)使用ReentrantLock来实现Lock。但细节的实现,我无法理解。
我知道AQS使用易失性,CAS和spin进行同步。但是,这些行为只控制“国家”成员。
虽然,LockSupport.park和LockSupport.unpark可以同步线程的进程。但是,如果从来没有争用,LockSupport方法将永远不会被调用。如下所示:1.线程--启动和运行
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.unlock()只将lock.lock() "state“成员,并将易失性的”状态“修改为0。
为什么线程B可以看到线程A关于共享成员的修改?
为什么ReentrantLock可以用作“同步”?
我没有看到任何像fullFence这样的代码来同步内存。
哪一种代码实现线程进程的同步?
谢谢!
发布于 2017-03-23 07:40:00
CAS操作定义发生在关系之前,因此Java内存模型保证来自线程的内存修改将从另一个线程中可见。
https://stackoverflow.com/questions/42966669
复制相似问题