1. 程式人生 > >java高併發(九)執行緒封閉

java高併發(九)執行緒封閉

上一節介紹了不可變物件,通過在某些情況下將不會修改的類物件設計成不可變物件,來讓物件在多個執行緒間保證物件是執行緒安全的。歸根到底,相當於躲避開了併發問題,實現好的併發是一件很困難的事情,所以很多時候都想躲避併發,避免併發除了設計成不可變物件其實還有一個簡單的方法就是執行緒封閉。

什麼是執行緒封閉?

其實就是把物件封裝到一個執行緒裡,只有這一個執行緒能看到這個物件。那麼這個物件就算不是執行緒安全的,也不會出現執行緒安全方面的問題了,因為他只能在一個執行緒裡面進行訪問。那麼如何實現執行緒封閉呢?

如何實現執行緒封閉?

  • Ad-hoc 執行緒封閉:程式控制實現,最糟糕,忽略
  • 堆疊封閉:區域性變數,無併發問題。是我們現實中使用最多的封閉了,簡單說就是區域性變數。多個執行緒訪問一個方法的時候,方法中的區域性變數都會被拷貝一份到執行緒棧中,所以區域性變數是不會被執行緒共享的,因此不會出現併發問題。所以全域性變數容易引起併發問題。
  • ThreadLocal執行緒封閉:特別好的封閉方法。ThreadLocal內部維護了一個map,key是執行緒的名稱,value就是封閉的物件。

 ThreadLocal

正常來講我們每一個請求對伺服器來講都是一個執行緒在執行,我們希