ReentrantLock概述

 ReentrantLock是Lock接口的实现类,可以手动的对某一段进行加锁。ReentrantLock可重入锁,具有可重入性,并且支持可中断锁。其内部对锁的控制有两种实现,一种为公平锁,另一种为非公平锁。ReentrantLock的实现原理为volatile+CAS

ReentrantLock可重入性

ReentrantLock具有可重入性,可重入性是指当一个线程拥有一个方法的锁以后,是否还可以进入该方法,一般这种情况出现在递归中。ReentrantLock的可重入性是基于Thread.currentThread()实现的,是线程粒度的,也就是说当前线程获得一个锁以后,当前线程的所有方法都可以获得这个锁。Reentrant依赖的锁只有两种实现类,NonFairSyncFairSync,但是它们获取锁的方式大同小异。一下是公平锁的获取实现。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有两种锁的实现,FairSyncNonFairSync,对于这两种锁,他们获取锁的方式都大同小异ReentrantLock$Sync#acquire

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信