Lock介面讀寫鎖原理介紹

2021-10-07 11:43:35 字數 2381 閱讀 2421

首先,介紹以下幾種執行緒間的通訊方式:

協作方式

死鎖方式1(通過主動加把鎖)

死鎖方式1(先喚醒再掛起)

備註suspend/resume

死鎖死鎖

棄用wait/notify

不死鎖死鎖

只能在synchronized關鍵字中用,基於物件監視器

park/unpark

死鎖不死鎖

用locksupport,令牌機制

condition的await/signal

不死鎖死鎖

只能在reentrantlock中用

(1)synchronized優點:使用簡單;由jvm提供,包括了多種優化方式(鎖公升級,具體可看我synchronized原理的部落格);鎖的釋放不用人工干預,由jvm釋放,降低了死鎖的可能性。

(2)synchronized缺點:無法使用鎖的高階功能,如讀寫鎖等,使用不靈活。

(3)lock優點:所有synchronized的缺點,lock都可以解決。

(4)lock缺點:需要手動釋放鎖呼叫unlock()方法,使用不當可能造成死鎖。

讀寫鎖維護了一對關聯鎖,讀鎖只用於讀操作,可同時被多個執行緒持有;寫鎖只用於寫操作,同時只能被乙個執行緒持有;並且在同一時間讀鎖和寫鎖也不能被同時持有,它適合讀多寫少的情況。讀寫鎖的api如下:

public

class

readwritelocktest

//寫方法

public

void

write()

public

static

void

main

(string[

] args)

throws interruptedexception }}

).start()

;}long endtime = system.

currenttimemillis()

; system.out.

println

("耗時:"

+(endtime - starttme));

}}

讀寫鎖的原理圖如下:

讀寫鎖中包含了四個部分:

(1)watiers:等待佇列,沒有搶到讀/寫鎖的執行緒被放入此佇列等待搶鎖;

(2)owner:標記寫鎖是被那個執行緒持有的,同一時間只能有乙個執行緒持有寫鎖;

(3)writecount:標記寫鎖(被同乙個執行緒)重入的次數;

(4)readcount:標記讀鎖(共享鎖)被幾個執行緒占用。

由於**不會搞━━( ̄ー ̄*|||━━,接下來我來用文字講解讀寫鎖的爭搶過程:

<1>執行緒t1來搶「寫鎖」,首先判斷readcount是否為0(因為讀/寫鎖互斥,不為0說明讀鎖被佔了,t1不能搶寫鎖),若readcount=0,則t1可以搶寫鎖,t1搶到了寫鎖,對writecount做cas操作加1,此時writecount=1,owner=t1;

<2>同樣的,t1又去搶「寫鎖」,先判斷readcount是否為0,再判斷writecount是否為0,目前writecount=1,owner=t1,因為owner=t1,所以t1又搶到了寫鎖,此時writecount=2,owner=t1;

<3>t2執行緒來搶「寫鎖」,先判斷readcount是否為0,再判斷writecount是否為0,目前writecount=2,owner=t1,t2搶不到寫鎖,t2進入watiers等待佇列;

<4>t1釋放一次寫鎖,此時writecount=1,owner=t1,再釋放一次寫鎖,此時writecount=0,owner=null,那麼此時在等待佇列中的t2就能搶到寫鎖,此時writecount=1,owner=t2;

<5>t3執行緒來搶「讀鎖」,先判斷writecount是否為0,此時writecount=1,即t2占用了寫鎖,而讀鎖與寫鎖互斥,所以t3搶不到讀鎖,t3進入等待佇列;

<6>同樣的t4,t5也來搶「讀鎖」,都搶不到,t4,t5進入等待佇列;

<7>t2釋放了寫鎖,此時writecount=0,owner=null,t3被喚醒,出等待佇列,重新去搶「讀鎖」,先判斷writecount是否為0,發現writecount=0,搶成功讀鎖,對readcount做cas操作加1,此時readcount=1;

<8>t4,t5經歷同樣的操作,此時readcount=3;

<9>此時t6執行緒又來搶「寫鎖」,發現readcount=3,搶寫鎖失敗,進入等待佇列;

<10>當t3,t4,t5都釋放了讀鎖,此時readcount=0,等待佇列中的t6執行緒就又能來搶寫鎖了。

以上就是我用文字描述的讀寫鎖爭搶的全過程,不止各位看官是否看懂了呢︿( ̄︶ ̄)︿

Java鎖 Lock實現原理 底層實現

static abstract class sync extends abstractqueuedsynchronizerfinal static class nonfairsync extends sync final static class fairsync extends syncfinal...

OC原理之讀寫鎖

讀寫鎖區別於執行緒鎖,讀寫鎖允許多個執行緒去讀,但是去寫的時候保證只有乙個在寫 初始化鎖 pthread rwlock init lock,null 加讀鎖 pthread rwlock rdlock lock 嘗試加讀鎖 pthread rwlock tryrdlock lock 解鎖 pthre...

多執行緒之讀寫鎖原理

今天主要通過多讀單寫的例子來說下讀寫鎖的原理 概念 多讀單寫,簡單說,就是對資源的訪問分為兩種狀態,一種是讀操作,另一種是寫操作。由應用程式提示鎖應該做哪種操作。當為讀模式時,所有的寫動作被懸掛,而讀請求被允許通過,而寫動作時,所有操作被懸掛。並且,讀寫切換時,有足夠的狀態等待,直到真正安全時,才會...