1. 程式人生 > >ThreadLocal 執行緒區域性變數

ThreadLocal 執行緒區域性變數

ThreadLocal

一、概念

ThreadLocal是Thread Local Variable(執行緒區域性變數)的意思。執行緒區域性變數的功能是為每一個使用該變數的執行緒都提供一個變數值的副本,使每一個執行緒都可以獨立的改變自己的副本,而不會和其他執行緒的副本衝突。從執行緒的角度看,就好像每一個執行緒都完全擁有該變數一樣。

二、使用

ThreadLocal提供了三個public方法:

get():返回此執行緒區域性變數中當前執行緒副本中的值。

remove():刪除此執行緒區域性變數中當前執行緒的值。

set(T value):設定此執行緒區域性變數中當前執行緒副本的值。

三、工作原理

ThreadLocal和其他所有的同步機制一樣,都是為了解決多執行緒中對同一變數的訪問衝突。

在普通的同步機制中,是通過物件加鎖來實現多個執行緒對同一變數的安全訪問的。改變數是多個執行緒共享的,系統沒有將這份資源複製多份,只是採用了安全機制來控制對這份資源的訪問而已。

ThreadLocal不能替代同步機制。ThreadLocal將需要併發訪問的資源複製多份,每個執行緒都有一份資源,每個執行緒都擁有自己的資源副本。ThreadLocal提供了執行緒安全的共享物件,在編寫多執行緒程式碼時,可以把不安全的整個變數封裝進ThreadLocal,或者把該物件與執行緒相關的狀態使用ThreadLocal儲存。

四、ThreadLocal與同步機制

1、ThreadLocal不能替代同步機制。

2、同步機制是為了同步多個執行緒對相同資源的併發訪問,是多個執行緒之間進行通訊的有效方式。

3、ThreadLocal是為了隔離多個執行緒的資料共享,從根本上避免多個執行緒之間對共享資源的競爭。

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

下面是專案中的示例程式碼,把使用者儲存在ThreadLoal,方便每次處理的時候能夠獲得當前請求操作的使用者:

@Component
public class HostHolder {
    private static ThreadLocal<User> users = new ThreadLocal<User>();

    public User getUser() {
        return users.get();
    }

    public void setUser(User user) {
        users.set(user);
    }

    public void clear() {
        users.remove();
    }
}

使用ThreadLocal來完成一個執行緒繫結一個使用者,從而確定到底是哪個使用者在登入和操作。


相關推薦

ThreadLocal 執行區域性變數

ThreadLocal 一、概念 ThreadLocal是Thread Local Variable(執行緒區域性變數)的意思。執行緒區域性變數的功能是為每一個使用該變數的執行緒都提供一個變數值的副本,使每一個執行緒都可以獨立的改變自己的副本,而不會和其他執行緒的副本衝突

理解ThreadLocal(執行區域性變數)

ThreadLocal(執行緒區域性變數)概述 ThreadLocal是什麼呢?其實ThreadLocal並非是一個執行緒的本地實現版本,它並不是一個Thread,而是threadlocalvariable(執行緒區域性變數)。也許把它命名為ThreadLocalVa

執行區域性變數的使用ThreadLocal和其底層原理

/*ThreadLocal類:   * 該類提供了執行緒區域性變數,它是一個池 Map<Thread.currentThread,locObj>,  * 池中為每個執行緒儲存一個獨立的區域性變數,  * 每個執行緒可以從這個池中讀取或設定自己的區域性變數。 //

31-執行區域性變數 ThreadLocal

執行緒區域性變數 ThreadLocal 原理,作用 每個Thread維護一個ThreadLocalMap 對映表,使用ThreadLocal物件為弱引用的map集合(即弱引用的物件可以在GC中被回收掉),value為對應的值。其生命週期和執行緒一致。

執行執行區域性變數ThreadLocal及原理

一、執行緒區域性變數ThreadLocal ThreadLocal為變數在每個執行緒中都建立了一個副本,那麼每個執行緒可以訪問自己內部的副本變數。既然是隻有當前執行緒可以訪問的資料,自然是執行緒安全的。 主要方法: initialValue()方法可以重寫,它預設是返回

Java中執行區域性變數ThreadLocal使用教程及原始碼分析

       在Java多執行緒程式設計中有時候會遇見執行緒本地區域性變數ThreadLocal這個類,下面就來講講ThreadLocal的使用及原始碼分析。        ThreadLocal 是Thread Local Varial(執行緒區域性變數)的意思,每個執行

執行區域性變數ThreadLocal的簡單使用

今天來說說ThreadLocal的使用: 什麼是ThreadLocal:ThreadLocal是執行緒區域性變數,所謂的執行緒區域性變數,就是僅僅只能被本執行緒訪問,不能線上程之間進行共享訪問的變數。在各個Java web的各種框架中ThreadLocal幾乎已經被用

淺談Flask 中的 執行區域性變數 request 原理

在多執行緒伺服器中客戶端每建立一個連結,伺服器就建立一個執行緒,每個執行緒中就會有一個request來表示客戶端的連結請求資訊。 不同的使用者訪問flask伺服器.都有自己的request. 使用者A------------執行緒A-------------> request

eclipse/cdt:-fPIC引起的執行區域性變數(__thread)的SIGSEGV異常問題

最近在 ubuntu下用eclipse Neon.3 (4.6.3) 除錯一個C工程時遇到一個好奇怪的問題: 一個應用程式A,呼叫一個靜態庫B,靜態庫中用__thread定義了執行緒區域性變數(TLS,thread local storage),在eclip

ThreadLocal執行變數

一、ThreadLocal本地執行緒變數     一般的Web應用劃分為展現層、服務層和持久層三個層次,在不同的層中編寫對應的邏輯,下層通過介面向上層開放功能呼叫。在一般情況下,從接收請求到返回響應所經過的所有程式呼叫都同屬於一個執行緒。    也就是說,同一執行緒貫通N

JAVA基礎23-多執行(二)【執行區域性變數和未捕獲異常處理器】

一、執行緒區域性變數    線上程中使用共享變數肯定是存在風險。為了規避這個風險,利用同步機制,volatile這些方法都可以。但是也可為每個執行緒分配一個變數。使用ThreadLocal輔助類為各個執行緒提供各自的例項。  ThreadLocal為每個使用

高併發下的執行安全實現——執行區域性變數

今天我們來討論另外一種執行緒安全的實現方法。如果說互斥同步是多執行緒間的資料共享,那麼執行緒區域性變數就是執行緒間的資料隔離。ThreadLocal把共享資料的可見範圍限制在同一個執行緒之內,這樣無須同步也能實現執行緒之間資料不爭用的問題。當使用ThreadLo

ThreadLocal執行本地變數的超詳細解析

              前段時間面試都遇到了有關ThreadLocal有關的問題,今天正好寫到了多執行緒,乾脆對ThreadLocal進行一個從簡單理解,到使用,到原始碼理解的學習和分析。               1.ThreadLocal是什麼          

Python學習總結筆記(4)--執行區域性變數之Threading.local

當我們使用執行緒的時候,能使用執行緒的區域性變數,就儘量不要用全域性變數,因為使用全域性變數涉及同步的問題(參見我的上一篇部落格Python學習總結筆記(3)–多執行緒與執行緒同步 )。 使用區域性變數的時候,需要傳遞引數,比如有這樣一個例子,程式需要處理客戶

【Java多執行】共享變數&同步-非同步容器&執行區域性變數

共享變數 (Volatile Atomic) volatile:當多個執行緒訪問一個成員變數的時候,需要這個變數在多個執行緒中可見。 Atomic:Atomic方法對該變數的操作是原子性操作,顆粒度是到對這個變數的一次操作。 private stati

執行-區域性變數和成員變數

Java多執行緒對成員變數和區域性變數的影響 最近複習了一下Java多執行緒的一些基礎的礎知識,這裡演示一個java多執行緒對成員變數和區域性變數的Demo 對區域性變數的操作: /** * Java區域性變數和成員變數程式碼演示 */ publi

4.2執行區域性變數(Thread-Local Variables)

    你有時候想要通過每個執行緒的資料(如一個使用者的ID)連線一個執行緒。儘管你可以使用區域性變數完成這個任務,僅僅只有區域性變數存在時你才可以這樣做。你可以用一個例項的欄位去長久儲存這個資料,但是你需要去處理同步。幸好,Java提供了java.lang.ThreadL

執行本地變數ThreadLocal

文章目錄 一、什麼是ThreadLocal 二、原始碼實現 set方法實現 get方法實現 remove方法實現 三、記憶體洩漏問題 一、什麼是ThreadLoca

執行本地變數 - ThreadLocal

參考網址: https://www.jianshu.com/p/98b68c97df9b (此處連結不知為何,點選後跳轉頁面還是本頁,建議複製開啟) 1、ThreadLocal是什麼? 執行緒本地變數,其為每個使用該變數的執行緒提供獨立的變數副本,所以每個執行緒都可以獨立的改變自己

ThreadLocal 執行範圍內的共享變數

package cn.itcast.heima2; import java.util.HashMap; import java.util.Map; import java.util.Random;    //執行緒範圍內的共享變數 public class ThreadLoc