1. 程式人生 > >多執行緒學習-執行緒本地ThreadLocal的介紹與使用

多執行緒學習-執行緒本地ThreadLocal的介紹與使用

ThreadLocal簡介

我們通過上兩篇的學習,我們已經知道了變數值的共享可以使用public static變數的形式,所有的執行緒都使用同一個被public static修飾的變數。

那麼如果我們想實現每一個執行緒都有自己的共享變數該如何解決哪?JDK提供的ThreadLocal正是為了解決這樣的問題的。

類ThreadLocal主要解決的就是每個執行緒繫結自己的值,可以將ThreadLocal類比喻成全域性存放資料的盒子,盒子中可以儲存每個執行緒的私有變數。

先舉個栗子

public class ThreadLocalDemo {

    public static ThreadLocal<List<String>> threadLocal = new
ThreadLocal<>(); public void setThreadLocal(List<String> values) { threadLocal.set(values); } public void getThreadLocal() { System.out.println(Thread.currentThread().getName()); threadLocal.get().forEach(name -> System.out.println(name)); } public
static void main(String[] args) throws InterruptedException { final ThreadLocalDemo threadLocal = new ThreadLocalDemo(); new Thread(() -> { List<String> params = new ArrayList<>(3); params.add("張三"); params.add("李四"); params
.add("王五"); threadLocal.setThreadLocal(params); threadLocal.getThreadLocal(); }).start(); new Thread(() -> { try { Thread.sleep(1000); List<String> params = new ArrayList<>(2); params.add("Chinese"); params.add("English"); threadLocal.setThreadLocal(params); threadLocal.getThreadLocal(); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } }

執行結果:

Thread-0
張三
李四
王五
Thread-1
Chinese
English

可以,看出雖然多個執行緒對同一個變數進行訪問,但是由於threadLocal變數由ThreadLocal 修飾,則不同的執行緒訪問的就是該執行緒設定的值,這裡也就體現出來ThreadLocal的作用。

當使用ThreadLocal維護變數時,ThreadLocal為每個使用該變數的執行緒提供獨立的變數副本,所以每一個執行緒都可以獨立地改變自己的副本,而不會影響其它執行緒所對應的副本。

ThreadLocal與synchronized同步機制的比較

在同步機制中,通過物件的鎖機制保證同一時間只有一個執行緒訪問變數。這時該變數是多個執行緒共享的,使用同步機制要求程式慎密地分析什麼時候對變數進行讀寫,什麼時候需要鎖定某個物件,什麼時候釋放物件鎖等繁雜的問題,程式設計和編寫難度相對較大。

ThreadLocal是執行緒區域性變數,是一種多執行緒間併發訪問變數的解決方案。和synchronized等加鎖的方式不同,ThreadLocal完全不提供鎖,而使用以空間換時間的方式,為每個執行緒提供變數的獨立副本,以保證執行緒的安全。


相關推薦

執行學習-執行本地ThreadLocal介紹使用

ThreadLocal簡介我們通過上兩篇的學習,我們已經知道了變數值的共享可以使用public static變數的形式,所有的執行緒都使用同一個被public static修飾的變數。那麼如果我們想實現每一個執行緒都有自己的共享變數該如何解決哪?JDK提供的ThreadLoc

執行學習----執行池(九)

1.固定執行緒池 建立一個執行緒池,裡邊放三個執行緒,建立十個任務,讓三個執行緒誰有空閒誰去執行這十個任務,直到任務結束。 public class ThreadPoolStudy { public static void main(String[] args) { //建

執行學習-----執行併發庫(八)

AtomicInteger:實現多執行緒對共享Integer資料型別變數的同步。 AtomicIntegerArray: 實現對Integer陣列某個元素的同步。 AtomicIntegerFieldUpdater:實現對某個類裡的整數同步。 。。。。。。  java.

執行學習----執行範圍內的共享資料(五)

執行緒範圍內的共享變數舉例: 建立三個執行緒,它們都訪問了三個物件,第一個物件設定值,第二三個物件取值,同一個執行緒設定的值,只能被相同的執行緒獲取, public class ThreadScopeShareDataStudy { private static int da

執行學習-----執行同步(四)

兩個執行緒要執行的程式碼片段要實現同步互斥的效果,它們必須用同一個Lock物件,鎖是上在代表要操作的資源類的內部方法中的,而不是線上程程式碼中, 問題:子執行緒迴圈10次,回到主執行緒執行100次,接著又回到子執行緒執行10次,再回到主執行緒執行100次,如此迴圈50次,該如何實現? p

執行學習-----------執行之間的通訊(三)

執行緒安全問題(demo:銀行轉賬):多個執行緒操作相同一個數據的時候就會出現執行緒安全問題。 程式舉例: public class SynchronizedStudy { class Output{ public void printName(String name){

執行學習---執行鎖的應用(十一)

Lock比傳統執行緒模型中的synchronized方式更加面向物件,與生活中的鎖類似,鎖本身也應該是一個物件。兩個執行緒執行的程式碼片段要實現同步互斥的效果,它們必須使用同一個Lock物件。鎖是上在代表要操作資源的類的內部方法中,而不是執行緒的程式碼中! 示例程式碼: public c

線程學習筆記九之ThreadLocal

當我 use gen nal get 內存泄漏 ble tables 目錄 目錄 多線程學習筆記九之ThreadLocal 簡介 類結構 源碼分析

Hadoop學習系列(2.Hadoop框架介紹搜索技術體系介紹)

消息 監控系統 mapreduce spa 文件系統 sql 平時 偽分布式 自己 第一天2.Hadoop框架介紹與搜索技術體系介紹1.大數據典型特性與分布式開發難點2.Hadoop框架介紹與搜索技術體系介紹3.Hadoop版本與特性介紹4.Hadoop核心模塊之HDFS分

windows Shell 學習記錄,1-------基礎介紹安全性

文件僅僅做記錄,賺一些積分 Windows UI 給使用者提供了執行應用程式、管理作業系統所需要的很大範圍的物件的訪問能力。其中,數量最大和最熟悉的就是我們平常所使用的駐留在電腦磁碟驅動器上的資料夾和資料夾。另外也有一些虛擬物件,允許使用者執行,類似將檔案傳送到遠端印表

學習Go 系列教程 —— 1. 介紹安裝

這是我們 Golang 系列教程的第一個教程。 Golang 是什麼 Go 亦稱為 Golang(譯註:按照 Rob Pike 說法,語言叫做 Go,Golang 只是官方網站的網址),是由谷歌開發的一個開源的編譯型的靜態語言。 Golang 的主要關注點是使得

Python全棧工程師學習筆記|Django框架介紹安裝

Python全棧工程師學習筆記|Django框架介紹與安裝 (1). Web開發介紹 進群:943752371可以獲取Python入門學習資料哦! Python全棧工程師學習筆記|Django框架介紹與安裝 目前Web開發屬於Browser/Server模式,簡稱B

kotlin學習筆記:object關鍵字介紹java中的靜態變數靜態方法的實現以及@JvmField和@JvmStatic的使用

在java中,靜態變數和靜態方法是我們經常需要用到的東西,但是我們在kotlin中,並不能找到static關鍵字。其實目前在kotlin中,也的確是static概念的,那麼我們該如何在kotlin中實現靜態變數和靜態方法呢?這時就要用到kotlin中的obje

LSD-SLAM深入學習(1)-基本介紹ros下的安裝

前言      借鑑來自RGB-D資料處理的兩種方法-基於特徵與基於整體的,同樣可以考慮整個圖片的匹配,而不是隻考慮特徵點的…… 主要介紹        主要參考一下幾篇文章,都是來自tum的。以後演算法與程式碼介紹都是基於這幾篇文章的,建議仔細研究,必定受益匪淺。  

Python全棧工程師學習筆記|Django框架介紹安裝!

wrap tle 無需 基礎設施 nag 當前 不同 shadow var (1). Web開發介紹 目前Web開發屬於Browser/Server模式,簡稱BS架構,開發語言有(Python、PHP、Java ...)。基於Python的Web工作原理如下:(2). 框架

Spring Cloud認知學習(一):Spring Cloud介紹Eureka使用

[toc] -------- 這是一個Spring Cloud系列文章,它並不會講解所有的知識點,它只是基於微服務的場景來**逐步介紹**常見元件的作用和意義,以及場景元件的整合。對於每個元件的知識並不會講解太多,只講常見的,目的是儘可能快速的對Spring Cloud的常用元件有一個基礎的認知,有

執行學習-----ThreadLocal使用(六)

一.對ThreadLocal的理解 ThreadLocal,很多地方叫做執行緒本地變數,也有些地方叫做執行緒本地儲存,其實意思差不多。可能很多朋友都知道ThreadLocal為變數在每個執行緒中都建立了一個副本,那麼每個執行緒可以訪問自己內部的副本變數。這句話從字面上看起來很容易理解,但是真正理

執行學習六——ThreadLocal的使用

package day1; import java.util.HashMap; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; im

Java執行程式設計-(3)-執行本地ThreadLocal介紹使用

原文出自 : https://blog.csdn.net/xlgen157387/article/details/78114278 ThreadLocal簡介 我們通過上兩篇的學習,我們已經知道了變數值的共享可以使用public static變數的形式,所有的執行緒都使

Java執行學習總結(Join)

join()方法的用法: join()是主執行緒 等待子執行緒的終止。也就是在子執行緒呼叫了 join() 方法後面的程式碼,只有等到子執行緒結束了才能執行。 例子如下: Java程式碼 p