1. 程式人生 > >ThreadLocal:解決多執行緒安全訪問 類靜態變數 的問題

ThreadLocal:解決多執行緒安全訪問 類靜態變數 的問題

JAVA 多執行緒程式設計 安全結論:

靜態變數:執行緒非安全。

靜態變數即類變數,位於方法區,為所有物件共享,共享一份記憶體,一旦靜態變數被修改,其他物件均對修改可見,故執行緒非安全。

例項變數:單例模式(只有一個物件例項存在)執行緒非安全,非單例執行緒安全。

例項變數為物件例項私有,在虛擬機器的堆中分配,若在系統中只存在一個此物件的例項,在多執行緒環境下,“猶如”靜態變數那樣,被某個執行緒修改後,其他執行緒對修改均可見,故執行緒非安全;如果每個執行緒執行都是在不同的物件中,那物件與物件之間的例項變數的修改將互不影響,故執行緒安全。

區域性變數:執行緒安全。

每個執行緒執行時將會把區域性變數放在各自棧幀的工作記憶體中,執行緒間不共享,故不存線上程安全問題。


使用ThreadLocal 解決多執行緒安全訪問靜態變數的問題:

Android中 Handler 獲取訊息佇列時,不管是主執行緒還是工作執行緒都是呼叫: Looper.myLooper(); 方法,然而 myLooper 方法中確用到了 靜態變數sThreadLocal;

按照一般的理解,Java 多執行緒訪問靜態變數是執行緒非安全的,主執行緒 和工作執行緒 得到的Looper是同一個looper物件才對,進而得到的是同一個訊息佇列:mQueue;如果真是這樣的話,所有訊息都在一個佇列裡面,豈不是出問題了?!

Android 用ThreadLocal 輕而易舉就解決了問題:

static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();

關於ThreadLocal :

主題:深入淺出ThreadLocal   http://www.iteye.com/topic/757478

主題:正確理解ThreadLocal  http://www.iteye.com/topic/103804

ThreadLocal並不是一個Thread  http://www.cnblogs.com/xubiao/p/5462170.html