(三)Java併發學習筆記–執行緒封閉

潘天涯發表於2018-08-14

執行緒封閉

實現好的併發是一件困難的事情,所以很多時候我們都想躲避併發。避免併發最簡單的方法就是執行緒封閉。什麼是執行緒封閉呢?
就是把物件封裝到一個執行緒裡,只有這一個執行緒能看到此物件。那麼這個物件就算不是執行緒安全的也不會出現任何安全問題。實現執行緒封閉有哪些方法呢?

1. ad-hoc執行緒封閉

這是完全靠實現者控制的執行緒封閉,他的執行緒封閉完全靠實現者實現。也是最糟糕的一種執行緒封閉。所以我們直接把他忽略掉吧。

2. 棧封閉

棧封閉是我們程式設計當中遇到的最多的執行緒封閉。什麼是棧封閉呢?簡單的說就是區域性變數。多個執行緒訪問一個方法,此方法中的區域性變數都會被拷貝一分兒到執行緒棧中。所以區域性變數是不被多個執行緒所共享的,也就不會出現併發問題。所以能用區域性變數就別用全域性的變數,全域性變數容易引起併發問題。

3. ThreadLocal封閉

使用ThreadLocal是實現執行緒封閉的最好方法,有興趣的朋友可以研究一下ThreadLocal的原始碼,其實ThreadLocal內部維護了一個Map,Map的key是每個執行緒的名稱,而Map的值就是我們要封閉的物件。每個執行緒中的物件都對應著Map中一個值,也就是ThreadLocal利用Map實現了物件的執行緒封閉。這裡就不說ThreadLocal的使用方法了,度娘一下便知。

總之,當我們要用執行緒封閉來避免併發問題的時候,最好使用的就是 【棧封閉】 和 【ThreadLocal】。


相關文章