簡單理解多執行緒ThredaLocal

2021-10-07 23:23:27 字數 2501 閱讀 5462

要了解threadlocal,首先搞清楚threadlocal 是什麼?是用來解決什麼問題的?

threadlocal 是執行緒的區域性變數, 是每乙個執行緒所單獨持有的,其他執行緒不能對其進行訪問, 通常是類中的 private static 字段,是對該字段初始值的乙個拷貝,它們希望將狀態與某乙個執行緒(例如,使用者 id 或事務 id)相關聯

我們知道有時候乙個物件的變數會被多個執行緒所訪問,這時就會有執行緒安全問題,當然我們可以使用synchorinized 關鍵字來為此變數加鎖,進行同步處理,從而限制只能有乙個執行緒來使用此變數,但是加鎖會大大影響程式執行效率,此外我們還可以使用threadlocal來解決對某乙個變數的訪問衝突問題。

但是要注意,雖然threadlocal能夠解決上面說的問題,但是由於在每個執行緒中都建立了副本,所以要考慮它對資源的消耗,比如記憶體的占用會比不使用threadlocal要大。

threadlocal 方法使用詳解

threadlocal 的幾個方法: threadlocal 可以儲存任何型別的變數物件, get返回的是乙個object物件,但是我們可以通過泛型來制定儲存物件的型別。

public t get()  // 用來獲取threadlocal在當前執行緒中儲存的變數副本

public void set(t value) //set()用來設定當前執行緒中變數的副本

public void remove() //remove()用來移除當前執行緒中變數的副本

protected t initialvalue() //initialvalue()是乙個protected方法,一般是用來在使用時進行重寫的

thread 在內部是通過threadlocalmap來維護threadlocal變數表, 在thread類中有乙個threadlocals 變數,是threadlocalmap型別的,它就是為每乙個執行緒來儲存自身的threadlocal變數的, threadlocalmap是threadlocal類的乙個內部類,這個map裡面的最小的儲存單位是乙個entry, 它使用threadlocal作為key, 變數作為 value,這是因為在每乙個執行緒裡面,可能存在著多個threadlocal變數

初始時,在thread裡面,threadlocals為空,當通過threadlocal變數呼叫get()方法或者set()方法,就會對thread類中的threadlocals進行初始化,並且以當前threadlocal變數為鍵值,以threadlocal要儲存的副本變數為value,存到threadlocals。

然後在當前執行緒裡面,如果要使用副本變數,就可以通過get方法在threadlocals裡面查詢

threadlocal是如何為每乙個執行緒建立乙個變數副本的,下面舉乙個例子來看一看。例子**於 部落格

public class threadlocaltest ;

};thread1.start();

thread1.join();

system.out.println(test.getlong());

system.out.println(test.getstring());

}threadlocallonglocal = new threadlocal();

threadlocalstringlocal = new threadlocal();

public void set()

public long getlong()

public string getstring()

**的輸出結果:

1main

9thread-0

1main

threadlocal 的應用場景

最常見的threadlocal使用場景為

用來解決 資料庫連線、session管理等。

資料庫連線:

class a implements runnable

};public static connection getconnection()

}session管理

private static final threadlocal threadsession = new threadlocal();

public static session getsession() throws infrastructureexception

} catch (hibernateexception ex)

return s;

}

threadlocal內部類有個threadlocalmap,這個是在啟動服務的時候就被例項,每次虛擬機器發現threadlocal的時候,

都會把你當前的執行緒號和threadlocal放在threadlocalmap,key為執行緒號,值為threadlocal,你可以在threadlocal存放集合物件,這樣你可以放多個值在裡面,為什麼他是安全不會被共享,就是通過執行緒號來確定,當乙個執行緒被使用的時候執行緒號不會重複

簡單的多執行緒理解

c 本身並沒有提供任何多執行緒機制,但是在windows下,我們可以呼叫sdk win32 api來編寫多執行緒的程式,下面就此簡單的講一下 建立執行緒的函式 handle createthread lpsecurity attributes lpthreadattributes,sd size t...

多執行緒 理解多執行緒(一)

程序 程序是cpu分配資源的基本單位 執行緒 執行緒是cpu排程的基本單位 資源分配給程序,所有執行緒共享該程序的資源 當執行緒數大於cpu的數量,會出現時間片的輪詢。cpu時間片是直接分配給執行緒的,執行緒拿到cpu時間片就能執行了 cpu時間片不是先分給程序然後再由程序分給程序下的執行緒的。所有...

多執行緒理解

本文介紹我對於多執行緒的理解。一 概念 1.作業系統下的多程序場景 但其實上面的情景是屬於作業系統下的多程序,不是單個程式內的多程序,這種多程序跟我們在單個程式內的多執行緒沒有什麼可以比較的。2.執行緒 舉個最簡單例子 我們的任務需要兩個計算型操作 a b 每個操作耗時10秒,如果是單執行緒,這時我...