ReentrantLock是Lock接口的实现类,可以手动的对某一段进行加锁。ReentrantLock可重入锁,具有可重入性,并且支持可中断锁。其内部对锁的控制有两种实现,一种为公平锁,另一种为非公平锁。ReentrantLock的实现原理为volatile+CAS。
ReentrantLock可重入性
ReentrantLock具有可重入性,可重入性是指当一个线程拥有一个方法的锁以后,是否还可以进入该方法,一般这种情况出现在递归中。ReentrantLock的可重入性是基于Thread.currentThread()实现的,是线程粒度的,也就是说当前线程获得一个锁以后,当前线程的所有方法都可以获得这个锁。Reentrant依赖的锁只有两种实现类,NonFairSync和FairSync,但是它们获取锁的方式大同小异。一下是公平锁的获取实现。ReentrantLock.FairSync.tryAcquire
1 protected final boolean tryAcquire(int acquires) { 2 final Thread current = Thread.currentThread(); 3 int c = getState(); 4 //每一次加锁state+1 5 if (c == 0) { 6 if (!hasQueuedPredecessors() && 7 compareAndSetState(0, acquires)) { 8 setExclusiveOwnerThread(current); 9 return true; 10 //尝试获取锁成功11 } 12 } 13 //是当前线程直接取到到锁,实现锁的可重入14 else if (current == getExclusiveOwnerThread()) { 15 int nextc = c + acquires; 16 if (nextc < 0) 17 throw new Error("Maximum lock count exceeded"); 18 setState(nextc); 19 return true; 20 } 21 return false; 22 } 23 }
ReentrantLock锁的实现分析
ReentrantLock有两种锁的实现,FairSync和NonFairSync,对于这两种锁,他们获取锁的方式都大同小异ReentrantLock$Sync#acquire

