日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ThreadLocal应用与原理分析

發布時間:2024/4/17 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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应用与原理分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。