ThreadLocal原理探尋

2021-06-26 10:42:47 字數 1520 閱讀 7734

筆者今天趁著專案空隙,學習了下threadlocal這個類,探尋了下多執行緒下如何實現執行緒安全的原理。**分享下:

package com.suning.sample.transcation;

public class threadtest

public static void main(string args)

private static class testclient extends thread

public void run()}}

}

輸出結果:

thread[thread-2]sn[1]

thread[thread-2]sn[3]

thread[thread-2]sn[4]

thread[thread-1]sn[2]

thread[thread-1]sn[5]

thread[thread-1]sn[6]

thread[thread-0]sn[7]

thread[thread-0]sn[8]

thread[thread-0]sn[9]

上述執行緒t1,t2,t3爭搶同乙個靜態變數物件seqnum,並且在run()方法中會連續三次獲取

seqnum值,每次獲取後會對seqnum值+1。thread-2在獲取到seqnum=1後,seqnum+1成為2,立馬存在thread-1訪問了seqnum值,並+1使得seqnum=3,以至於thread-2再次訪問seqnum的時候獲取的seqnum=3.以上模擬了多執行緒下資源爭搶的情景。

package com.suning.sample.transcation;

public class sequencenum

};public int getnextnum()

public static void main(string args)

private static class testclient extends thread

public void run()}}

}

結果:

thread[thread-1]sn[1]

thread[thread-1]sn[2]

thread[thread-1]sn[3]

thread[thread-2]sn[1]

thread[thread-2]sn[2]

thread[thread-2]sn[3]

thread[thread-0]sn[1]

thread[thread-0]sn[2]

thread[thread-0]sn[3]

上述執行緒t1,t2,t3共享sn,使用同乙個seqnum物件,但是執行緒卻沒有互相影響,均是各自列印自己的1,2,3.為什麼呢?

因為threadlocal,多執行緒下會複製乙份自己的seqnum,各自執行緒之間的資料是互不影響的。所以把不安全的變數放以泛型的方式放入threadlocal可以解決執行緒不安全的問題。

ThreadLocal原理詳解

threadlocal稱為執行緒本地變數,其為變數在每個執行緒中都建立了乙個副本,每個執行緒都訪問和修改本執行緒中變數的副本。應用示例 可以看出,為每個執行緒分配乙個變數副本的工作並不是由threadlocal實現的,需要在應用層面實現,threadlocal只是提供乙個容器。如果在應用上為每個執行...

ThreadLocal實現原理

threadlocal,即執行緒區域性變數,其實就是乙個容器,每個執行緒都可通過其set方法儲存乙份資料,並且在get時只會獲取自己執行緒的資料,是常用的實現執行緒安全的方式。自己用過許多次了,但沒有細究其原理,今天大概看了一下原始碼,算是明白了一點點0.0 直接看threadlocal的get方法...

ThreadLocal作用,原理

threadlocal一般被稱為執行緒池本地變數或執行緒本地儲存。起作用是為 當前執行緒 提供乙個臨時持有和傳遞物件的方法。由同乙個執行緒鎖執行的 只要持有同乙個threadlocal物件的引用,就都能訪問到與當前執行緒繫結的同乙個資料物件。threadlocal的內部宣告乙個自動定義的thread...