什麼是執行緒範圍內共享變數?
執行緒範圍內的共享變數是指對同乙個變數,幾個執行緒同時對它進行寫和讀操作,而同乙個執行緒讀到的資料就是它自己寫進去的資料。也就是說每個執行緒只能訪問他自己的,不能訪問別的執行緒的。
首先我們看未實現範圍內共享變數的例子,以此來解決執行緒範圍內共享變數的解決方式:
public class threadscopesharedata
}).start();
} }static class a }
static class b
}}
輸出結果:
thread-0 has put data :533593121
thread-1 has put data :343058745
a from thread-0 get data :343058745
a from thread-1 get data :343058745
b from thread-1 get data :343058745
b from thread-0 get data :343058745
從結果我們看到,不管是thread-0還是thread-1,獲取的值都是thread-1的,也就是thread-0沒有獲取到他自己的值,因為執行緒thread-0剛把data設定值之後,還沒有執行start(),data值就被thread-1給改變了,所以出現了兩個執行緒輸出值相等的情況。
對於這種情況可以採用以下方法實現:
1.將寫的資料放入乙個map的value中,key就是進行這個寫操作的執行緒物件,這樣讀的時候每個執行緒就只能從map中讀到自己對應的value。
2.使用threadlocal,threadlocal類似map,它可以為每個執行緒裝載乙個物件,這個物件是和執行緒繫結的,threadlocal在哪個執行緒中執行操作,它就會自動選擇那個與執行緒繫結的物件。
下面我們看通過map的方式如何實現:
public class threadscopesharedata
}).start();
} }static class a }
static class b
}}
執行結果:
thread-0 has put data :-1979727275
thread-1 has put data :1534341934
a from thread-1 get data :1534341934
a from thread-0 get data :-1979727275
b from thread-1 get data :1534341934
b from thread-0 get data :-1979727275
我們通過map的key/value形式,區分了執行緒及其資料,以實現了執行緒範圍內的共享變數。
執行緒範圍內共享變數的用處:
後文我們將繼續使用threadlocal來解決執行緒範圍內共享變數問題,以及對threadlocal的更多認識。
執行緒範圍內共享資料
我們可以先用所學知識來寫乙個 public class threadscopesharedata start static class a static class b 如果光像上面這樣寫的話,那毫無疑問,肯定是有問題的,如下圖所示並沒有實現執行緒共享 此時就實現執行緒內共享資料了 public c...
執行緒範圍內共享資料
假設現在有個公共的變數data,有不同的執行緒都可以去操作它,如果在不同的執行緒對data操作完成後再去取這個data,那麼肯定會出現執行緒間的資料混亂問題,因為a執行緒在取data資料前可能b執行緒又對其進行了修改,下面寫個程式來說明一下該問題 public class threadscopesh...
執行緒範圍內共享資料ThreadLocal
原始碼 private t setinitialvalue 1 原始版本 public class threadlocaltestbefore start new thread new runnable start a b類分別為使用執行緒區域性變數的資料 static class a static...