锁内存语义的实现
2018-06-21 15:12:55 36 举报
为你推荐
查看更多
锁内存语义的实现
作者其他创作
大纲/内容
NonfairSync
+ final void lock() :void+ protected final boolean tryAcquire(int acquires :int):void
Sync
+ protected final boolean tryRelease(int releases:int) :boolean+ final boolean nonfairTryAcquire(int acquires:int):boolean
- private final Sync sync
+ public void lock():void+ public void unlock():void
从上面源代码中我们可以看出,加锁方法首先读volatile变量state。在使用公平锁时,解锁方法unlock()调用轨迹如下。1)ReentrantLock:unlock()。2)AbstractQueuedSynchronizer:release(int arg)。3)Sync:tryRelease(int releases)。在第3步真正开始释放锁,下面是该方法的源代码。
ReentrantLock分为公平锁和非公平锁,首先我们分析公平锁:使用公平锁时,加锁防范lock()调用归集为如下:1)ReentrantLock:lock();2) FairSync: lock()3) AbstractQueuedSynchronized:acquired(int arg)4)ReentrantLock: tryAcquire(int acquires)
公平锁在释放锁的最后写volatile变量state,在获取锁时首先读这个volatile变量。根据volatile的happens-before规则,释放锁的线程在写volatile变量之前可见的共享变量,在获取锁的线程读取同一个volatile变量后将立即变得对获取锁的线程可见
FairSync
AbstractQueuedSynchronizer
+ private volatile int state:int
+ public final void acquire(int arg : int) :void+ public final boolean release(int arg : int):void
ReentrantLock 的实现依赖于Java同步器AbstractQueuedSynChronizer(AQS)。AQS使用一个 整型的volatile变量(命令为 state)来维护 同步状态,
0 条评论
回复 删除
下一页