摘要:介紹以下是源碼中對的官方解釋,已經(jīng)非常精煉了。簡單例子其實源碼里已經(jīng)給出了使用的樣例,這里就當(dāng)自我熟悉一下。顧名思義,目的就是讓可以訪問的。而且可以通過重寫方法任意改變的簡單例子年月日主要源碼可以參考這篇文章源碼解讀
ThreadLoal介紹
以下是JDK1.8源碼中對ThreadLocal的官方解釋,已經(jīng)非常精煉了。
Each thread holds an implicit reference to its copy of a thread-local variable as long as the thread is alive and the ThreadLocal instance is accessible; after a thread goes away, all of its copies of thread-local instances are subject to garbage collection (unless other references to these copies exist).
白話一點就是每個thread在自己的生命周期內(nèi)維護著一個本地變量,僅供自身上下文使用。
ThreadLocal 簡單例子其實JDK源碼里已經(jīng)給出了使用的樣例,這里就當(dāng)自我熟悉一下。(這個例子主要是為了用下initialValue(),可以直接看第二個簡單例子)
package cn.lw.thread; import java.util.UUID; /** * @author wanglei 2018年5月3日 */ public class ThreadLocalTest3 { public static void main(String[] args) { MyThread3 myThread = new MyThread3(); Thread t1 = new Thread(myThread, "t1"); Thread t2 = new Thread(myThread, "t2"); t1.start(); t2.start(); try { t1.join(); //等待t1終止 t2.join(); //等待t2終止 } catch (InterruptedException e) { e.printStackTrace(); } } } class MyThread3 implements Runnable { @Override public void run() { // 初始化當(dāng)前thread的local-value,僅當(dāng)前thread可見 ThreadLocalmyThreadLocal = new ThreadLocal () { @Override protected String initialValue() { return UUID.randomUUID().toString(); } }; String name = Thread.currentThread().getName(); // 獲取初始值 String initialValue = myThreadLocal.get(); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // 將當(dāng)前thread的local-value改為指定值 myThreadLocal.set(UUID.randomUUID().toString()); System.out.println("Thread name: " + name + ", init: " + initialValue + ", next: " + myThreadLocal.get()); } }
Output:
Thread name: t2, init: 26e62cc8-1457-43a2-956c-6e53f5ccadd3, next: 7d32cd8d-7143-4879-a65b-a0841d2b6e9d Thread name: t1, init: 9ab664fc-0af2-4a1d-bcd8-e4f056b6748f, next: 7a6f44dc-bd20-438e-85be-ff42ba19ad6eInheritableThreadLocal
這個類繼承自ThreadLocal。顧名思義,目的就是讓child-thread可以訪問parent-thread的local-value。而且可以通過重寫childVaule()方法任意改變parent-thread的local-value.
InheritableThreadLocal 簡單例子package cn.lw.thread; import java.util.UUID; /** * @author wanglei 2018年5月3日 */ public class ThreadLocalDemo { public static void main(String[] args) { new Thread(new ParentClass("p1")).start(); new Thread(new ParentClass("p2")).start(); } } class ThreadLocalManager { // private static final ThreadLocallocalValue = new ThreadLocal<>(); private static final InheritableThreadLocal localValue = new InheritableThreadLocal<>(); public static void setLocalValue() { localValue.set(UUID.randomUUID().toString()); } public static String getLocalValue() { return localValue.get(); } public static void removeLocalValue() { localValue.remove(); } } class ParentClass implements Runnable { private String name; public ParentClass(String name) { this.name = name; } @Override public void run() { ThreadLocalManager.setLocalValue(); System.out.println("parent name: "+name+", loval value: "+ThreadLocalManager.getLocalValue()); String childName = name + "_child"; ChildClass childClass = new ChildClass(childName); Thread childThread = new Thread(childClass); childThread.start(); try { childThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } class ChildClass implements Runnable { private String name; public ChildClass(String name) { this.name = name; } @Override public void run() { System.out.println("child name: "+name+", loval value: "+ThreadLocalManager.getLocalValue()); } }
Output:
parent name: p2, loval value: 3a623559-9457-4cb0-8ba1-b958336a70cd parent name: p1, loval value: 48594e57-a114-43c1-980e-034074387d0a child name: p2_child, loval value: 3a623559-9457-4cb0-8ba1-b958336a70cd child name: p1_child, loval value: 48594e57-a114-43c1-980e-034074387d0a
ThreadLocal 主要源碼可以參考這篇文章:ThreadLocal源碼解讀
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71100.html
摘要:我們通過之前幾章的學(xué)習(xí)已經(jīng)知道在線程間通信用到的關(guān)鍵字關(guān)鍵字以及等待通知機制。今天我們就來講一下線程間通信的其他知識點管道輸入輸出流的使用的使用。將當(dāng)前線程的此線程局部變量的副本設(shè)置為指定的值刪除此線程局部變量的當(dāng)前線程的值。 系列文章傳送門: Java多線程學(xué)習(xí)(一)Java多線程入門 Java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(1) java多線程學(xué)習(xí)(二)synchr...
摘要:方法,刪除當(dāng)前線程綁定的這個副本數(shù)字,這個值是的值,普通的是使用鏈表來處理沖突的,但是是使用線性探測法來處理沖突的,就是每次增加的步長,根據(jù)參考資料所說,選擇這個數(shù)字是為了讓沖突概率最小。 showImg(https://segmentfault.com/img/remote/1460000019828633); 老套路,先列舉下關(guān)于ThreadLocal常見的疑問,希望可以通過這篇學(xué)...
摘要:等待通知機制利用,實現(xiàn)的一個生產(chǎn)者一個消費者和一個單位的緩存的簡單模型上面例子中我們生產(chǎn)了一個數(shù)據(jù)后就需要對這個數(shù)據(jù)進行消費如果生產(chǎn)了但數(shù)據(jù)沒有被獲取則生產(chǎn)線程會在等待中直到調(diào)用了方法后才會被繼續(xù)執(zhí)行反之也是一樣的也就是說方法是使線程暫停 等待/通知機制 利用wait,notify實現(xiàn)的一個生產(chǎn)者、一個消費者和一個單位的緩存的簡單模型: public class QueueBuffer...
摘要:為了追蹤一個請求完整的流轉(zhuǎn)過程,我可以給請求分配一個唯一的,當(dāng)請求調(diào)用其他服務(wù)時,我們傳遞這個。這是一個簡單的實現(xiàn)分布式調(diào)用追蹤的實踐,以上。 背景 分布式環(huán)境下,跨服務(wù)之間的調(diào)用錯綜復(fù)雜,如果突然爆出一個錯誤,雖然有日志記錄,但到底是哪個服務(wù)出了問題呢?是移動端傳的參數(shù)有錯誤,還是系統(tǒng)X或者系統(tǒng)Y提供的接口導(dǎo)致?在這種情況下,錯誤排查起來就非常費勁。 為了追蹤一個請求完整的流轉(zhuǎn)過程,...
閱讀 1397·2023-04-25 18:34
閱讀 3460·2021-11-19 09:40
閱讀 2837·2021-11-17 09:33
閱讀 2952·2021-11-12 10:36
閱讀 2838·2021-09-26 09:55
閱讀 2663·2021-08-05 10:03
閱讀 2527·2019-08-30 15:54
閱讀 2873·2019-08-30 15:54