鎖是一段**,當執行緒執行到這段**時執行緒阻塞(掛起)或者進入輪詢
使用方式:
reentrantlock lock = new reentrantlock();//預設建立非公平鎖
lock.lock();
***鎖住的**邏輯
***lock.unlock();
執行到 lock()方法時做的事情(建立的非公平鎖):
(1)判斷當前執行緒能否獲取鎖
(2)如果不能獲取鎖把當前執行緒加入到等待的執行緒佇列中
(3)當前執行緒掛起
(4)等待當前執行緒的上乙個執行緒釋放鎖以後喚醒當前執行緒
按著步驟做具體**分析:
(1)判斷當前執行緒能否獲取鎖
//reentrantlock 的無參建構函式預設生成非公平鎖
static final class nonfairsync extends sync
}
(2)把執行緒加到佇列中
//把執行緒加入到佇列的方法入口
public final void acquire(int arg)
tryacquire方法執行一下操作:
//非公平方式獲取鎖
final boolean nonfairtryacquire(int acquires)
} else if (current == getexclusiveownerthread())
return false;
}}addwaiter執行一下操作:
}//如果沒有尾節點,也就是說隊列為空,需要先初始化乙個空的【節點的執行緒變數為null】節點當頭,然後把當前節點往頭節點後邊加
enq(node);
return node;
}}
(3) 當前執行緒掛起:
//判斷當前執行緒能否掛起
/***假如第一次迴圈當前執行緒不是頭節點,判斷是否能夠掛起,經過下邊的操作假如說不能掛起
*會進行二次迴圈,二次迴圈到這兒的時候當前執行緒的前乙個節點已經是掛起狀態,反正也輪
*不到當前執行緒啥事,也就直接掛起了當前執行緒
**/if (shouldparkafte***iledacquire(p, node) &&
parkandcheckinterrupt())
interrupted = true;
}} finally
}private static boolean shouldparkafte***iledacquire(node pred, node node) while (pred.waitstatus > 0);
pred.next = node;
} else
return false;
}//掛起當前執行緒
private final boolean parkandcheckinterrupt() }
(4)等待當前執行緒的上乙個執行緒釋放鎖以後喚醒當前執行緒
//當前執行緒執行完後執行釋放鎖方法,lock.unlock()方法
public void unlock()
public final boolean release(int arg)
return false;
}protected final boolean tryrelease(int releases)
//更新鎖的狀態
setstate(c);
return free;
}private void unparksuccessor(node node)
//喚醒下乙個節點
if (s != null)
locksupport.unpark(s.thread);
}
已上為reentrantlock鎖的原理 ReentrantLock 原理分析
public void lock 這是lock的原始碼,呼叫的其實是sync這個物件的lock函式,而sync是reentrantlock內部類sync的乙個物件例項,他有兩種實現nonfairsync 非公平鎖 和fairsync 公平鎖 先看公平鎖的lock函式 final void lock ...
ReentrantLock實現原理分析
本文只對reentrantlock中獲取鎖和釋放鎖的方法進行分析,其它方法不做分析。final void lock protected final boolean tryacquire int acquires else if current getexclusiveownerthread retu...
ReentrantLock之AQS原理與原始碼詳解
abstractqueuedsynchronizer,抽象佇列同步器 給大家畫乙個圖先,看一下reentrantlock和aqs之間的關係。abstractqueuedsynchronizer為reentrantlock的靜態內部類 2 預設為非公平鎖 3 最終會呼叫abstractqueuedsy...