CAS演算法和ThreadLocal

Adrian_Dai發表於2018-03-04


CAS操作是一種樂觀鎖技術,是指在運算元據之前先判斷資料是否修改過(通過預期值與記憶體值比較是否相等來判斷),只有當資料沒被修改過的時候,才寫入資料;注意CAS操作存在ABA問題,即A被修改為B又被修改為A,導致無法判斷A是否變化過,解決該問題可以通過引入版本號等手段

ThreadLocal類及應用技巧

JDK1.5提供了ThreadLocal類來方便實現執行緒範圍內的資料共享

每個執行緒呼叫全域性ThreadLocal物件的set方法,就相當於往其內部的map集合中增加一條記錄,key就是各自的執行緒,value就是各自的set方法傳進去的值。

線上程結束時可以呼叫ThreadLocal.clear()方法用來更快釋放記憶體,也可以不呼叫,因為執行緒結束後也可以自動釋放相關的ThreadLocal變數。

一個ThreadLocal物件只能記錄一個執行緒內部的一個共享變數,需要記錄多個共享資料,可以建立多個ThreadLocal物件,或者將這些資料進行封裝,將封裝後的資料物件存入ThreadLocal物件中。

將資料物件封裝成單例,同時提供執行緒範圍內的共享資料的設定和獲取方法,提供已經封裝好了的執行緒範圍內的物件例項,使用時只需獲取例項物件即可實現資料的執行緒範圍內的共享,因為該物件已經是當前執行緒範圍內的物件了

防止多執行緒訪問共享資源產生異常結果的另外一種方式是消除資源的共享,可以使用執行緒本地儲存ThreadLocal達到這樣的效果,即為每個執行緒建立一個共享資源的儲存,從而消除多個執行緒對該資源的共享訪問;

可以通過get和set方法訪問該物件的內容,每個執行緒對value的訪問相互獨立,互不干擾,因為它們訪問的本來就不是同一個資源


相關文章