在資源競爭激烈的時候,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...