可重入鎖,可中斷鎖,公平鎖的理解
1.可重入鎖(表明了鎖的分配機制):
Synchronized和ReentrantLock都是可重入鎖
比如當一個執行緒執行到Synchronized方法method1,而method1方法中呼叫了另一個Synchrogazed方法method2
此時執行緒不需要重新申請一把鎖,可以直接執行method2
class MyClass {
public synchronized void method1() {
method2();
}
public synchronized void method2() {
}
}
如果不具備可重入性,method2沒有Synchronized,那麼A執行緒會去申請一把鎖,而A擁有該物件鎖,就會導致執行緒A一直在申請獲取不到的鎖
2.可中斷鎖:
Synchronized是不可中斷鎖,LOCK為可中斷鎖
如果執行緒A正在執行鎖中的程式碼,執行緒B在等待獲取該物件鎖,如果等待時間過長,想讓B去做其他事情,可以讓他自己中斷或者在別的執行緒中斷它
3.公平鎖:
Synchronized是非公平鎖,ReentrantLock和ReentrantReadWriteLock預設是非公平鎖,可以開啟公平鎖
根據執行緒的等待時間來分配鎖,比如執行緒C的等待時間最長,C就獲得該鎖
public ReentrantLock() {
sync = new NonfairSync();
}
public ReentrantLock(boolean fair) {
sync = (fair)? new FairSync() : new NonfairSync();
}
通過有參構造傳入布林值是否開啟公平鎖,預設不開啟公平鎖
ReentrantLock方法:
isFair() //判斷鎖是否是公平鎖
isLocked() //判斷鎖是否被任何執行緒獲取了
isHeldByCurrentThread() //判斷鎖是否被當前執行緒獲取了
hasQueuedThreads() //判斷是否有執行緒在等待該鎖