ThreadLocal實現執行緒間變數隔離

2021-10-04 03:51:23 字數 1708 閱讀 3669

之前做android開發時曾看過threadlocal原始碼,但目前又忘記了。寫下篇文章,簡單回顧下吧

首先看下threadlocal的簡單例子

import org.apache.logging.log4j.logmanager;

import org.apache.logging.log4j.logger;

public

class

threadlocaltest

catch

(interruptedexception e)

logger.

debug

(threadlocal.

get())

;},"t1");

thread t2 =

newthread((

)->

catch

(interruptedexception e)

logger.

debug

(threadlocal.

get())

;},"t2");

t1.start()

; t2.

start()

; logger.

debug

(threadlocal.

get())

;}public

static

void

main

(string[

] args)

}

輸出的結果如下

23:46:44.904 [main] debug threadlocaltest - main thread

23:46:45.904 [t1] debug threadlocaltest - t1 thread

23:46:45.904 [t2] debug threadlocaltest - t2 thread

可以看到,各執行緒獲取到的變數均為自身執行緒存放的變數

下面從threadlocal的new,set,get來看下原始碼

從以上原始碼可以看到,每個執行緒在呼叫threadlocal的set方法和get方法時,其實都是對當前執行緒thread類的成員變數threadlocalmap做訪問,每個執行緒的threadlocalmap都是不同的例項,所以雖然threadlocal是相同的,但卻能實現訪問的變數相互隔離。

那是不是如上面分析那樣呢?我們執行上面的測試**,debug看下

下圖為t1執行緒截圖,threadlocalmap位址是@2341

下圖為t2執行緒截圖,threadlocalmap位址是@2344

下圖為main執行緒截圖,threadlocalmap位址是@2313

由此驗證了我們上面的分析。threadlocal在訪問變數時,操作的是當前呼叫執行緒的threadlocalmap,每個執行緒有自己的threadlocalmap,各不相同,所以同乙個threadlocal實現了執行緒間變數的隔離

Threadlocal實現執行緒封閉

threadlocal可以為全域性狀態變數,在當前執行執行緒建立乙個副本,這個副本只允許當前執行緒訪問,其他執行緒無法訪問,實現執行緒封閉。通過介面方法set在當前執行執行緒的副本上設定值,通過get獲取設定的值,第一次呼叫get時候會執行乙個初始化方法initialvalue初始化副本值。pack...

ThreadLocal是怎麼實現執行緒隔離的

案例 public static void main string args cc1 start new thread new runnable cc2 start 輸出 cc1 2 cc2 null threadlocal的set t t 方法原始碼 public void set t value...

018 ThreadLocal實現執行緒安全

一 概述 在之前我們討論過執行緒安全性的問題,我們通過加鎖或者使用無鎖來保證執行緒安全.當然無鎖的效能會變得更好.但是他們的實質的核心都是保證對訪問的資源的原子性.那我們回憶一下執行緒安全性問題的發生的條件 1 多執行緒併發 2 共享資源 3 對共享資源的非原子性操作 我們如果將共享資源打破掉,那麼...