1.公平鎖
是指多個執行緒按照申請鎖的順序來獲取資源,類似於佇列,先進先出(fifo)。
2.非公平鎖
是指多個執行緒獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的執行緒先獲得鎖。在高併發的情況下,有可能造成優先順序反轉或飢餓現象。
public reentrantlock(boolean fair)
引數為true為公平,false為非公平,預設引數是非公平鎖
3.可重入鎖(也叫遞迴鎖)
指的是同一執行緒外層函式獲取鎖之後,內層遞迴函式仍然能獲取該鎖的**,在同乙個執行緒在外層方法獲取鎖的時候,再進入內層方法會自動獲取鎖,也即是說,執行緒可以進入到任何乙個它已經擁有的鎖所同步著的**塊。
可重入鎖的最大作用是避免死鎖
驗證兩種典型得到可重入鎖的性質(synchronized和reentrantlock()):
(1)先驗證synchronized,建立乙個questionandanswer類,question() 方法中嵌入了answer()方法
public synchronized void question()
public synchronized void answer()
結果:
由此可見該執行緒的鎖進入了內層方法,從而驗證了可重入鎖的性質
(2)驗證reentrantlock()方法,實現runnable介面,同樣在ques()方法中嵌入ans()方法,以下是部分**:
lock lock = new reentrantlock();
@override
public void run()
public void ques() finally
} public void ans() finally
}
結果:
由此可見結果和上面相同,從而也驗證了可重入鎖的性質
4.自旋鎖
是指嘗試獲取的執行緒不會立即阻塞,而是採用迴圈的方式去嘗試和獲取鎖,這樣做的好處是減少執行緒上下文切換的消耗,缺點是迴圈會消耗cpu。
例:讀寫鎖是一種特殊的自旋鎖,它把對共享資源對訪問者劃分成了讀者和寫者,讀者只對共享資源進行訪問,寫者則是對共享資源進行寫操作。讀寫鎖在reentrantlock上進行了拓展使得該鎖更適合讀操作遠遠大於寫操作對場景。乙個讀寫鎖同時只能存在乙個寫鎖但是可以存在多個讀鎖,但不能同時存在寫鎖和讀鎖。
如果讀寫鎖當前沒有讀者,也沒有寫者,那麼寫者可以立刻獲的讀寫鎖,否則必須自旋,直到沒有任何的寫鎖或者讀鎖存在。如果讀寫鎖沒有寫鎖,那麼讀鎖可以立馬獲取,否則必須等待寫鎖釋放。(但是有乙個例外,就是讀寫鎖中的鎖降級操作,當同乙個執行緒獲取寫鎖後,在寫鎖沒有釋放的情況下可以獲取讀鎖再釋放讀鎖這就是鎖降級的乙個過程)
// 新增乙個執行緒型別的原子引用,預設值為null
atomicreferenceatomicreference = new atomicreference();
// 加鎖的方法
public void mylock()
// 解鎖的方法
public void unlock()
(2)主函式**
spinlockdemo spinlockdemo = new spinlockdemo();
new thread(() -> catch (interruptedexception e)
spinlockdemo.unlock();
}).start();
try catch (interruptedexception e)
new thread(() -> catch (interruptedexception e)
spinlockdemo.unlock();
}).start();
當主函式中thread-0沒有執行unlock()方法時結果:
當主函式中thread-0執行了unlock()方法時結果:
以上結果說明當thread-0執行了mylock()方法後再啟動thread-1執行緒時,thread-1將會一直被卡在while迴圈中,只能等到thread-0執行了unlock()方法後將atomicreference物件值變為null,thread-1才跳出了while迴圈得以繼續接下來的方法
(3)驗證讀寫鎖,通過模仿乙個快取機制來實現。剛開始沒有對方法加任何鎖,為了和加上鎖之後形成對比
private volatile mapmap = new hashmap();
// 寫操作
public void set(string key, string value) catch (interruptedexception e)
}
// 讀操作
public void get(string key) catch (interruptedexception e)
}
public void set(string key, string value) catch (interruptedexception e) finally
}
public void get(string key) catch (interruptedexception e) finally
}
5.獨佔鎖指該鎖一次只能被乙個執行緒所持有
6.共享鎖
指該鎖可被多個先執行緒所持有
2019 11 14 樂觀擴寬了自己想象的範圍
08 05 每乙個願景在真正達成之前看起來都像笑話,一旦達成,它就會變得司空見慣。羅伯特 戈達德 昨天,銷售同事老吳過來我這蹭茶喝時,老是感嘆自己沒能把銷售工作做好。其實,他的這個煩惱還挺讓我欣慰的。不久之前,他的抱怨是銷售不好做,我狠狠地反駁了他並非銷售本身這個工作有問題,而是他把銷售崗位做壞了。...
c語言實戰開發 2019 11 14 Day2
1 我們學c語言的目的是什麼 2 程式怎麼搞出來 過程 3 c語言和c 的區別 4 注釋的使用 5 include的介紹 6 main函式介紹 7 printf函式格式化輸出 8 scanf函式格式化輸出 9 變數的定義 1 面試用到的知識點。2 後期服務 尤其是android開發。3 培養程式設計...
一 人際關係的基本技巧 2019 11 14
1 這些監獄裡的亡命之徒,都從來也不責怪自己。那麼,我們日常所接觸的那些人呢?2 批評所引起的憤恨,經常會降低員工 家人以及朋友的士氣,而且所指責的狀況也依然不會得到改善。3 不要評議別人,別人才不會評議你 4 白朗寧 當乙個人先從自己的內心開始奮鬥,他就是個有價值的人。5 假如你我明天要造成一種經...