關(guān)于并發(fā)包當(dāng)中的ReenTrantLock 的實(shí)現(xiàn)等我研究完ConcurrentHashMap 之后再看看
可重入鎖使用的目的:
? ? ? ? 保證線程訪問時的線程安全薇正;
與普通鎖的區(qū)別:
? ? ? ? 可重入鎖可以避免線程死鎖
場景描述:多線程訪問場景,其中獲得了鎖的線程可能重復(fù)獲得鎖? ?
即:? Thread1? --->lock? ? ?Thread2 ---> wait()? ?Thread3 ----> wait()? ? ?Thread4 ---> wait()? ?
? ? ? ? ?Thread1 ---->lock? (重復(fù)加鎖? 如果解鎖過程只有一次 則造成死鎖)??
public? class? Lock{
? ? ? ? boolean? isLocked? =? false;
? ? ? ? Thread? lockBy? =? null? ;
? ? ? ? ?int? ?lockCount? =? 0;
? ? ? ? ?public? synchronized? void? lock ()? {? ? ? ? ? ? ? ? ////////加鎖方式
? ? ? ? ? ? ? ? Thread? thread? =? Thread.currentThread();
? ? ? ? ? ? ? ? while(? isLocked? &&? lockBy != thread ){
? ? ? ? ? ? ? ? ? ? ? ? ? ? wait () ;
?????????????????}
? ? ? ? ? ? ? ? isLocked = true ;
? ? ? ? ? ? ? ? lockCount ++ ;
? ? ? ? ? ? ? ? lockBy = thread;?
? ? ? ?}?
? ? ? ?public? synchronized? void? unlock () {
? ? ? ? ? ? ? ?if ( Thread . currentThread (? )? == this . lockBy )? {
? ? ? ? ? ? ? ? ? ? ? ? lockCount --;? ? ? ? ? ? ? ? ? //////////? 防止出現(xiàn)獲得了鎖的線程雙重加鎖后? ?卻只解鎖一遍? 造成死鎖
? ? ? ? ? ? ? ? ? ? ? ? if ( lockCount == 0 ) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? isLocked? =? false ;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? notify();
????????????????????????}????
? ? ? ? ? ? ? ? }
????????}
}