假設現在有個公共的變數data,有不同的執行緒都可以去操作它,如果在不同的執行緒對data操作完成後再去取這個data,那麼肯定會出現執行緒間的資料混亂問題,因為a執行緒在取data資料前可能b執行緒又對其進行了修改,下面寫個程式來說明一下該問題:
publicclass
threadscopesharedata
}).start();}}
static
class
testa
}static
class
testb
}}
來看一下列印出來的結果:
從結果中可以看出,兩次對data賦的值確實不一樣,但是兩個執行緒最後列印出來的都是最後賦的那個值,說明thread-0拿出的資料已經不對了,這就是執行緒間共享資料帶來的問題。
publicclass
threadscopesharedata
}).start();}}
static
class
testa
}static
class
testb
}}
上面程式中維護了乙個map,鍵值對分別是執行緒和它的資料,那麼在操作data的時候,先把各自的資料儲存到這個map中,這樣每個執行緒儲存的肯定不同,當再取的時候,根據當前執行緒物件作為key來取出對應的data副本,這樣不同的執行緒之間就不會相互影響了。這個hashmap也需要包裝一下,因為hashmap是非執行緒安全的,上面的程式中,不同的執行緒有對hashmap進行寫操作,就有可能產生併發問題,所以也要包裝一下。最後來看一下執行結果:
就是執行緒範圍內共享資料,即同乙個執行緒裡面這個資料是共享的,執行緒間是不共享的。
執行緒範圍內共享資料
我們可以先用所學知識來寫乙個 public class threadscopesharedata start static class a static class b 如果光像上面這樣寫的話,那毫無疑問,肯定是有問題的,如下圖所示並沒有實現執行緒共享 此時就實現執行緒內共享資料了 public c...
執行緒範圍內共享資料ThreadLocal
原始碼 private t setinitialvalue 1 原始版本 public class threadlocaltestbefore start new thread new runnable start a b類分別為使用執行緒區域性變數的資料 static class a static...
執行緒範圍內共享資料的例子
設計四個執行緒,其中兩個執行緒每次給增加j增加一,另外兩個給j減一。設計四個執行緒,其中兩個執行緒每次給增加i增加一,另外兩個給i減一。方式一 呼叫兩個繼承了runnable類的類進行資料的加減操作 public class threadscopedatatest static class incr...