執行緒相關類(ThreadLocal類)

2021-07-09 14:05:35 字數 1628 閱讀 2836

threadlocal,是tread local varcable(執行緒區域性變數)的意思。執行緒區域性變數(threadlocal)的功能其實非常簡單,就是為每乙個使用該變數的執行緒都提供乙個變數值的副本(threadlocal是採用雜湊表的方式來為每個執行緒都提供乙個變數的副本),而不會和其它執行緒的副本衝突。從執行緒的角度看,就好像每乙個執行緒都完全擁有該變數一樣。

threadlocal 類的用法非常簡單,它只提供了如下三個public方法。

下面程式將證明threadlocal 的作用:

class account

public string getname()

public void setname(string str)

}class mytest extends thread

public void run()

// 輸出同乙個賬戶的賬戶名和迴圈變數

system.out.println(account.getname()

+ "賬戶的i值: " + i);}}

}public class threadlocaltest

}

上面account 類中的**分別完成了建立threadlocal 物件、從threadlocal中取出執行緒區域性變數、修改執行緒區域性變數的操作。由於程式中的賬戶名是乙個threadlocal 變數,所以雖然程式中只有account物件,但兩個子執行緒將會產生兩個賬戶名(主線程也持有乙個賬戶名的副本)。兩個執行緒進行迴圈時都會在i == 6時將賬戶名改為與執行緒名相同,這樣就可以看到兩個執行緒擁有兩個賬戶名的情形,如下圖所示:

測試結果為:

從上面程式可以看出,實際上賬戶名有三個副本,主線程乙個,另外啟動的兩個執行緒各乙個,它們的值互不干擾,每個執行緒完全擁有自己的threadlocal變數,這就是threadlocal的用途。

threadlocal 和其他所有的同步機制一樣,都是為了解決多執行緒中同一變數的衝突,在普通的同步機制中,是通過物件加鎖來實現多個執行緒對同一變數的安全訪問的。該變數是多個執行緒共享的,所以要使用這種同步機制,需要很細緻地分析在什麼時候對變數進行讀寫,什麼時候需要鎖定某個物件,什麼時候釋放該物件的鎖等。在這種情況下,系統並沒有將這份資源賦值多份,知識採用了安全機制來控制對這份資源的訪問而已。

threadlocal 從另乙個角度來解決多執行緒的併發訪問,threadlocal 將需要併發訪問的資源賦值多份,每個執行緒擁有乙份資源,每個執行緒都擁有自己的資源副本,從而也就沒有必要對該變數進行同步了。threadlocal 提供了執行緒安全的共享物件,在編寫多執行緒代時,可以把不安全的整個變數封裝進threadlocal ,或者把該物件與執行緒相關的狀態使用threadlocal 儲存。

threadlocal 並不能代替同步機制,兩者面向的問題領域不同。同步機制是為了同步多個執行緒對同資源的併發訪問,是多個執行緒之間進行通訊的有效方式;而threadlocal 是為了隔離多個執行緒的資料共享,從根本上避免多個執行緒之間對共享資源(變數)的競爭,也就不需要對多個執行緒進行同步了。

通常建議:如果多個執行緒之間需要共享資源,已達到執行緒之間的通訊功能,就使用同步機制:如果僅僅需要隔離多個執行緒之間的共享衝突,則可以使用threadlocal。

執行緒相關的工具類

前言 監控執行緒 說明 執行緒監控工具類 日期 2016 2 4 public class treadutils 獲取執行緒的簽名 public static string getthreadsignature 獲取執行緒的簽名 一次性獲取,內容和上面方法一樣 public static void ...

執行緒管理之Thread類相關方法簡介

currentthread 靜態方法 currentthread 方法可返回 段正在被那個執行緒呼叫的資訊。簡單案列 列印main 方法,正在被那個執行緒呼叫 package com.zzg.thread import com.zzg.obj.threadobj1 public class thre...

多執行緒 執行緒池相關

銀行有四個視窗辦業務,好比四個cpu。如果只開乙個執行緒的話,相當於所有辦業務的人都排成一隊在乙個視窗辦業務,或者說每個人都必須等上乙個人辦完業務之後隨機選乙個視窗,總之就是序列乙個個來。所以這體現了多執行緒優點的就是可以充分利用現在計算機配置多核cpu的硬體特性,把多核cpu利用起來提高任務的處理...