java中的鎖(未完待續)

2021-08-08 03:13:42 字數 1404 閱讀 7964

在資源競爭激烈的時候,lock效能強於synchronized的原因:

以reentrantlock為例:

經過觀察reentrantlock把所有lock介面的操作都委派到乙個

sync類

上,該類繼承了

abstractqueuedsynchronizer

:當有執行緒競爭鎖時,該執行緒會首先嘗試獲得鎖,這對於那些已經在佇列中排隊的執行緒來說顯得不公平,這也是非公平鎖的由來

,與synchronized實現類似,這樣會極大提高吞吐量。 

如果已經存在running執行緒,則新的競爭執行緒會被追加到隊尾,具體是採用基於cas的lock-free演算法,因為執行緒併發對tail呼叫cas可能會導致其他執行緒cas失敗,解決辦法是

迴圈cas直至成功。

該方法會首先判斷當前狀態,如果c==0說明沒有執行緒正在競爭該鎖,如果不c !=0 說明有執行緒正擁有了該鎖。 

如果發現c==0,則通過cas設定該狀態值為acquires,acquires的初始呼叫值為1,每次執行緒重入該鎖都會+1,每次unlock都會-1,但為0時釋放鎖。如果cas設定成功,則可以預計其他任何執行緒呼叫cas都不會再成功,也就認為當前執行緒得到了該鎖,也作為running執行緒,

很顯然這個running執行緒並未進入等待佇列。

如果c !=0 但發現自己已經擁有鎖,只是簡單地++acquires,並修改status值,但因為沒有競爭,所以通過setstatus修改,而非cas,也就是說這段**實現了偏向鎖的功能,並且實現的非常漂亮。

高併發環境下優化鎖或無鎖(lock-free)的設計思路

lock用的是樂觀鎖方式。所謂樂觀鎖就是,每次不加鎖而是

假設沒有衝突

而去完成某項操作,如果因為衝突失敗就

重試,直到成功為止

。樂觀鎖實現的機制就是cas操作(compare and swap)

。進一步研究reentrantlock的源**,會發現

其中比較重要的獲得鎖的乙個方法是compareandsetstate。這裡其實就是呼叫的cpu提供的特殊指令。

cas無鎖演算法

要實現無鎖(lock-free)的非阻塞演算法有多種實現方法,其中 cas(比較與交換,compare and swap) 是一種有名的無鎖演算法。cas, cpu指令,在大多數處理器架構,包括ia32、space中採用的都是cas指令,cas的語義是「我認為v的值應該為a,如果是,那麼將v的值更新為b,否則不修改並告訴v的值實際為多少」,cas是項 樂觀鎖 技術,當多個執行緒嘗試使用cas同時更新同乙個變數時,只有其中乙個執行緒能更新變數的值,而其它執行緒都失敗,失敗的執行緒並不會被掛起,而是被告知這次競爭中失敗,並可以再次嘗試。cas有3個運算元,記憶體值v,舊的預期值a,要修改的新值b。當且僅當預期值a和記憶體值v相同時,將記憶體值v修改為b,否則什麼都不做。

nginx 未完待續

yum install y pcre yum install y pcre devel yum install y openssl yum install y openssl devel yum install y zlib yum install y gccyum安裝 yum install y ...

sqlparse(未完待續)

sqlparse.split sql,encoding none sql 包含乙個或多個sql語句的字串 encoding 語句的編碼 可選 sql select from foo select from bar sql list sqlparse.split sql print sql list ...

CALayer使用(未完待續)

一 什麼是calayer?在ios系統中,你能看得到摸得著的東西基本都是uiview。比如乙個按鈕 乙個文字標籤 乙個文字輸入框 乙個圖示等等,這些都是uiview。其實uiview之所以顯示在螢幕上,完全是因為它內部的乙個層。在建立uiview物件時,uiview內部會自動建立乙個層 即calay...