1 7 ThreadLocal的原理和使用詳解

2021-10-06 22:04:42 字數 2757 閱讀 9017

目錄

一、why:為什麼要用threadlocal

1.1示例:不使用threadlocal,使用static,每個值修改同乙個變數,產生錯誤

1.2執行結果,可能有幾種可能性:

1.3使用threadlocal

1.4結果:都是2

二、threadlocal的使用

2.1threadlocal類介面很簡單,常用的有4個方法

2.2remove的測試

2.3執行結果 

三、threadlocal初始化方法的使用

1、實現方法initialvalue

2、通過lomoba表示式

1、執行緒物件內部自定義threadlocal

2、通過建構函式傳遞進執行緒的threadlocal變數

/**

* 不使用threadlocal共同使用變數,使用static,每個值修改同乙個變數,產生錯誤

* @author: honry.guan

* @create: 2020-06-07 18:53

**/public class nothreadlocaltest extends thread

public static void main(string args)

}}

thread-1: 開始執行,num = 1

thread-0: 開始執行,num = 1

thread-0 結束,num = 3

thread-2: 開始執行,num = 1

thread-1 結束,num = 2

thread-2 結束,num = 4

也有可能是:

thread-1: 開始執行,num = 1

thread-2: 開始執行,num = 1

thread-2 結束,num = 2

thread-0: 開始執行,num = 1

thread-0 結束,num = 4

thread-1 結束,num = 4

public class nothreadlocaltest extends thread

};@override

public void run()

public static void main(string args)

}}

thread-0: 開始執行,num = 1

thread-2: 開始執行,num = 1

thread-2 結束,num = 2

thread-1: 開始執行,num = 1

thread-0 結束,num = 2

thread-1 結束,num = 2

• void set(object value):設定當前執行緒的執行緒區域性變數的值。

• public object get():該方法返回當前執行緒所對應的執行緒區域性變數。

• public void remove():移除變數,如果最開始是1,通過set修改之後,呼叫remove之後,get出來的值又變成1

• protected object initialvalue():初始,第一次呼叫set或get才執行,並且僅執行一次。

public class nothreadlocaltest extends thread

};@override

public void run()

public static void main(string args)

}}

thread-1: 開始執行,num = 1

thread-2: 開始執行,num = 1

thread-0: 開始執行,num = 1

thread-0 結束,num = 2

thread-2 結束,num = 2

thread-1 結束,num = 2

thread-1 結束remove之後,num = 1

thread-2 結束remove之後,num = 1

thread-0 結束remove之後,num = 1

private threadlocalnum = new threadlocal()

};

threadlocalnum = threadlocal.withinitial(()->1);
(我剛學的時候一直被這個事情困擾,自己手寫幾次之後明白)

public class nothreadlocaltest extends thread

};@override

public void run()

public static void main(string args)

}}

public class nothreadlocaltest extends thread

@override

public void run()

public static void main(string args)

}

此時不論什麼乙個執行緒能夠併發訪問這個變數,對它進行寫入、讀取操作,都是執行緒安全的。

執行緒區域性變數ThreadLocal實現原理

之前做專案用到過threadlocal,但是沒有看原始碼層面的具體實現,今天特來補一補課。threadlocal,即執行緒區域性變數,用來為每乙個使用它的執行緒維護乙個獨立的變數副本。那種以時間換取空間的做法不同,threadlocal沒有任何鎖機制,它以空間換取時間的方式保證變數的執行緒安全。1 ...

關於threadlocal的來龍去脈

對tls更簡單的,但是更直觀的理解可以如下 基於c語言 1.全域性物件,全域性變數的作用域和生命週期是全域性的,這裡的全域性是指程序範疇,也就是說,如果你將其設計為全域性物件,全域性變數,就意味著你希望在多執行緒的環境中,仍然能共享和訪問。全域性物件,全域性變數不是說不讓多執行緒來訪問,而是說有的時...

ThreadLocal的個人理解

threadlocal的設計思想十分簡單,它的核心物件就是threadlocalmap,被宣告在thread類裡面,每個thread都持有乙個threadlocalmap,所以才能實現執行緒隔離,以達到儲存共享變數的作用 threadlocal.threadlocalmap threadlocals...