java多執行緒 執行緒範圍內共享變數(四)

2021-07-04 23:37:43 字數 1628 閱讀 7733

什麼是執行緒範圍內共享變數?

執行緒範圍內的共享變數是指對同乙個變數,幾個執行緒同時對它進行寫和讀操作,而同乙個執行緒讀到的資料就是它自己寫進去的資料。也就是說每個執行緒只能訪問他自己的,不能訪問別的執行緒的。

首先我們看未實現範圍內共享變數的例子,以此來解決執行緒範圍內共享變數的解決方式:

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...