ThreadLocal应用与原理分析
生活随笔
收集整理的這篇文章主要介紹了
ThreadLocal应用与原理分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ThreadLocal的作用
ThreadLocal類用來提供線程內部的局部變量,并且這些變量依靠線程獨立存在.可以在多個線程中互不干擾的進行存儲數據和修改數據,通過set,get 和remove方法, 每個線程都是獨立的操作.ThreadLocal試圖解決的問題是:在線程生命周期內,在任何運行時刻可以方便的訪問一些數據,而不是依靠參數傳遞的方式。ThreadLocal只能存儲一個變量
ThreadLocal如何使用
ThreadLocal使用比較簡單,在線程啟動或者任何開始處理業務是調用set(T t)方法,將變量存儲在線程空間中,往后再任何需要使用的地方可以使用get()方法獲取到前面set的變量,最后在完成使用時調用remove()清除變量
import java.util.Scanner; import java.util.concurrent.Executors;public class Main {public static void main(String[] args) throws InterruptedException {myThread t1=new myThread(false);myThread t2=new myThread(true);t1.setName("Thread1");t2.setName("Thread2");t1.start();t2.start();t1.join();t2.join();}} class myThread extends Thread {private ThreadLocal<String> local=new ThreadLocal<String>(){@Overrideprotected String initialValue() {// TODO Auto-generated method stubreturn "threadLocal的初始化";}};private boolean read=false;public myThread(boolean read){this.read=read;}public void run(){if(read==false){local.set(Thread.currentThread().getName()+"local");System.out.println(local.get());}else {System.out.println(local.get());}} }運行結果
result》》》》》》》》 Thread1local threadLocal的初始化 public class Calculator {ThreadLocal<String> local = new ThreadLocal<>();public int add(int a, int b) {return a + b;}public int sub(int a, int b) {return a - b;}public static void main(String[] args) {Calculator c = new Calculator();c.local.set("1");c.local.set("2");System.out.println(c.local.get());System.out.println(c.local.get());} }運行結果:
2
2
原理分析:
Thread類在init時并沒有ThreadLocal.ThreadLocalMap threadLocals = null;
在ThreadLocal中設置變量
- 1、根據Thread的native方法獲得jvm當前正在運行的線程
- 2、獲取當前線程的threadLocals成員變量,對象類型為ThreadLocal.ThreadLocalMap
- 3、如果ThreadLocalMap對象為空,則調用createMap(Thread t, T firstValue)創建ThreadLocal.ThreadLocalMap對象實例,并賦值給當前線程的成員變量threadLocals
- 4、如果對象不為空,則將T t設置到當前線程的ThreadLocalMap對象threadLocals中。
在ThreadLocal中獲取變量
- 1、獲取當前線程綁定的ThreadLocalMap對象
- 2、如果當前線程綁定的ThreadLocalMap對象為空,則初始化綁定的ThreadLocalMap對象,并設置null值,返回null
- 3、如果ThreadLocalMap對象不為空,則根據當前的ThreadLocal對象在ThreadLocalMap中的 Entry[] table 中獲取對應的Entry
- 4、返回Entry中的value
刪除ThreadLocal中獲取變量
ThreadLocal進階
總結
以上是生活随笔為你收集整理的ThreadLocal应用与原理分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ES6系列之Set Map
- 下一篇: Oracle 游标的各种写法