国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

ThreadLocal的使用及實現原理

開發 前端
ThreadLocal可以用來把實例變量共享成全局變量,讓程序中所有的方法都可以訪問到該變量。

前言

ThreadLocal直譯是本地線程,但實際上它的譯名是線程局部變量(ThreadLocalVariable)。ThreadLocal誕生的目的是隔離不同線程所使用的變量,官方對它的解釋是:

提供了線程局部變量,是獨立于變量的初始化副本”,也就是說它可以實現將某一個變量隔離在某個線程內,其它的線程無法訪問和使用這個變量。

我們先來做一個測試,先不使用ThreadLocal,創建三個線程:

public class ThreadLocalTest {
public static int num = 0;
public static int numAdd() {
return num++;
}
public static void main(String[] args) {
Thread t1 = new Thread(new MyRunnable());
Thread t2 = new Thread(new MyRunnable());
Thread t3 = new Thread(new MyRunnable());
t1.start();
t2.start();
t3.start();
}
public static class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName() + "-" + ThreadLocalTest.numAdd());
}
}

}
}

執行后發現控制臺輸出的是:

可以發現線程執行了numAdd()方法,從0-8跑了九次,num從0加到8,也就是說線程之間共享了靜態變量,從而導致線程的不安全問題。

然后我們再使用ThreadLocal來進行測試。

public class ThreadLocalTest {
private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
@Override
protected Integer initialValue() {
return 0;
}
};
public static int numAdd() {
threadLocal.set(threadLocal.get()+1);
return threadLocal.get();
}
public static void main(String[] args) {
Thread t1 = new Thread(new MyRunnable());
Thread t2 = new Thread(new MyRunnable());
Thread t3 = new Thread(new MyRunnable());
t1.start();
t2.start();
t3.start();
}
public static class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName() + "-" + numAdd());
}
}

}
}

這里的numAdd方法使用了ThreadLocal的get()方法,這個方法調用了initialValue()方法并設置了返回值為0,通過調用這個方法+1,達到了num++的效果,這時候再看輸出的結果。

可以看到,三個不同的線程間相互隔離,變量的取值互不相干,也就是說ThreadLocal使用了不相干的變量,或者說ThreadLocal為每一個線程準備了一個變量副本,那么它是如何實現的呢,我們點進ThreadLocal的源碼看看。

這就是ThreadLocal的構成了,主要操作是get()和set()方法:

get() : 返回當前ThreadLocal的值

 public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}

set() : 將當前線程對象的值存入ThreadLocalMap中

public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}

首先創建了當前Thread的對象,然后存入ThreadLocalMap中,對map進行判斷,不為空就將this(當前Threadlocal對象)存入作為key,并獲取對應的值,最后是調用了一個setInitialValue()方法去獲得初始化的值。

ThreadLocalMap

介紹上面兩個方法主要是是為了引出ThreadLocal的實現原理,即ThreadLocalMap的創建和使用。

官方注釋中解釋道,ThreadLocalMap是一個定制的哈希映射,只適用于維護ThreadLocal的值。在ThreadLocal類之外沒有導出操作。類是包私有的,以允許在類線程中聲明字段。為了幫助處理非常大且長期使用的用法,哈希表條目對鍵使用弱引用。

但是,由于不使用引用隊列,只有當表開始耗盡空間時,才開始刪除陳舊的條目。

點開ThreadLocalMap,可以看到一開始ThreadLocalMap定義了一個用于存儲數據的Entry 類。

 static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}

這個Entry類繼承了弱引用類,眾所周知Java有四種引用類型,其中弱引用就是每次JVM進行垃圾回收時,都會回收該對象,保證了ThreadLocal每次拷貝當前線程的值的時候所占的空間能被重新使用。

由get()方法可以得知,ThreadLocalMap的鍵(key)是ThreadLocal類的實例對象,value為用戶的值。

那么ThreadLocalMap的引用是在哪里呢,在上面的set()方法里,調用了getMap()和createMap()方法。

ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}

可以看到這邊調用了一個叫threadLocals的屬性,點擊這個屬性發現跳到了Thread類中。

  /* ThreadLocal values pertaining to this thread. This map is maintained
* by the ThreadLocal class. */
ThreadLocal.ThreadLocalMap threadLocals = null;

所以這個屬性便是ThreadLocalMap的引用了,那么ThreadLocal的實現原理也就很清晰了:

  1. 定義了一個ThreadLocalMap內部類,使用的是Map的鍵值對方式來存取數據,key是ThreadLocal類的實例對象,value為傳值。
  2. 創建新的ThreadLocal對象,調用set()或get()方法時,也就是調用了ThreadLocalMap來進行操作。
  3. 使用ThreadLocal時,線程所使用的變量是獨享的(私有的變量副本),其他線程無法訪問,在使用過后(線程結束),這些變量會被GC回收。

使用ThreadLocal的原因

ThreadLocal可以用來把實例變量共享成全局變量,讓程序中所有的方法都可以訪問到該變量。

由于存到ThreadLocal的變量都是當前線程本身,其他線程無法訪問,存到ThreadLocal中只是為了方便在程序中同一個線程之間傳遞這個變量(和解決線程安全沒有關系)。

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-05-06 08:55:24

ThreadLocal多線程多線程并發安全

2025-05-27 01:00:00

2015-03-10 13:55:31

JavaScript預解析原理及實現

2023-09-08 08:20:46

ThreadLoca多線程工具

2015-09-09 08:45:49

JavaThreadLocal

2009-03-27 10:10:13

c#遠程啟動遠程管理

2017-02-06 19:26:15

iOSCFArray開源

2017-03-02 10:49:37

推薦算法原理實現

2015-12-02 15:29:32

HTTP網絡協議代理原理

2015-12-02 14:10:56

HTTP網絡協議代理原理

2021-06-10 08:29:15

Rollup工具前端

2023-12-18 09:39:13

PreactHooks狀態管理

2023-02-28 11:27:50

線程處理解決共享變量

2023-08-31 08:12:23

應用場景業務異常HTTP

2019-11-12 11:15:39

setTimeout前端代碼

2010-05-12 10:53:04

Symbian開發

2018-07-27 08:39:44

負載均衡算法實現

2019-09-30 08:28:53

Delta LakeSpark數據原理

2017-07-19 15:25:16

iOS開發ARKitOpen GL

2020-06-09 11:35:30

Vue 3響應式前端
點贊
收藏

51CTO技術棧公眾號

亚洲va中文在线播放免费| 最新在线观看av网站| 精品成人自拍视频| 亚洲开心激情网| 亚洲国产精品久久久久秋霞蜜臀| 久久夜精品香蕉| 国产777精品精品热热热一区二区| 国产欧美va欧美不卡在线 | 外国成人直播| 麻豆成人在线观看| 第一会所sis001亚洲| 亚洲第一区中文字幕| 在线视频网站| 国产成人综合在线观看| 国产精品一区二区三区观看| 免费一区二区三区视频导航| 亚洲欧美精品伊人久久| 亚洲综合伊人| 亚洲a在线播放| 成人黄色网址| 欧美亚洲愉拍一区二区| 日本久久久久久久久久久久| 精品一二三四区| 神马影院一区二区| 亚洲国产电影| 国产精品视频一区二区三区经| 韩国精品福利一区二区三区| 欧美wwwxxxx| 久久爱www.| 日日夜夜精品网站| 超级污的网站| 91免费观看国产| 亚洲欧美日韩国产成人精品影院| 777精品久无码人妻蜜桃| 国产成人一级电影| av免费观看国产| 国产精品美女久久久久久久久久久| 国产黄色一级网站| 亚洲欧洲在线观看av| 色视频在线观看免费| 日韩一级完整毛片| 久久久久伊人| 国产精品人成电影| 国产亚洲精品bv在线观看| 日韩欧美一区二区在线观看| 一区二区三区四区视频精品免费 | 亚洲国产午夜伦理片大全在线观看网站 | 日韩av在线播放资源| 国产黄色特级片| 日韩电影免费一区| 亚洲精品女av网站| 日韩在线综合| 国产成人精品亚洲精品| 岛国中文字幕在线| 欧美日韩精品一区二区三区| 色综合视频一区二区三区日韩| 国产精品18久久久久久首页狼| 精油按摩中文字幕久久| 美日韩黄色片| 亚洲国产精彩中文乱码av| 亚洲精品中文字幕99999| 成人免费淫片视频软件| 成人av在线一区二区| 国产一二三区在线观看| 国产精品激情av电影在线观看| 国产一区二区电影| 国产视频在线播放| 国产亚洲精品久久飘花| 亚洲精品乱码久久久久久 | 影音国产精品| 国产天堂在线观看| 欧美激情在线有限公司| 成人夜色视频网站在线观看| 免费黄网站在线| 久久久久久草| 精品电影一区二区| 老汉av免费一区二区三区| 国产丝袜在线播放| 在线国产伦理一区| 亚洲成人激情视频| 精品中文av资源站在线观看| 日本免费在线视频| www.av一区视频| 欧美日韩综合在线| 欧美最新另类人妖| 一级二级在线观看| 久久久久无码国产精品一区| 精品视频色一区| 久久精品国产99| 国内在线精品| 日韩久久精品一区二区三区| 亚洲精品v天堂中文字幕| 捆绑紧缚一区二区三区视频| 影音成人av| 黄色国产网站| 精品国产二区在线| 亚洲精品短视频| 中文字幕av一区二区三区高| 99视频精品全国免费| 在线视频国产区| 一区不卡字幕| 久久99精品久久久久久琪琪| 2017欧美狠狠色| 成人在线分类| 性开放的欧美大片| 日本日本19xxxⅹhd乱影响| 欧美黑人xxxx| 日韩欧美在线1卡| 国产精品久久| 天堂中文在线播放| 日本免费视频| 日韩aⅴ视频一区二区三区| 国产成一区二区| 色多多国产成人永久免费网站| 日本精品一区二区三区高清| 国产校园另类小说区| 狠狠网亚洲精品| 中文字幕欧美人与畜| 日韩av中字| 超碰国产在线| 国产在线视频福利| 中国大陆高清aⅴ毛片| 欧美三级理论片| 欧美国产综合在线| 日本欧美精品久久久| 国产青春久久久国产毛片| 亚洲综合最新在线| 亚洲最大福利视频网站| 国产在线拍揄自揄视频不卡99 | 亚洲无吗在线| 久久久亚洲人| 不卡在线观看av| 亚洲六月丁香色婷婷综合久久| 国产亚洲女人久久久久毛片| 99re热视频这里只精品| 久久久激情视频| 一区二区三区欧美日| 天堂av最新在线| 2019中文字幕视频| 男人的天堂在线| 爱啪视频在线观看视频免费| 动漫一区二区| 日本成人手机在线| 亚洲一本视频| 久久久美女毛片| 日韩欧美在线网址 | 成人免费淫片| 亚州av中文字幕在线免费观看| 涩爱av在线播放一区二区| 成人在线观看一区| 天堂av中文在线观看| 成人免费在线电影网| 亚洲一区不卡| 亚洲天堂精品视频| 亚洲电影免费观看| 亚洲自拍小视频| 阳光姐妹淘韩国版| 久久人人视频| 日韩av二区| 国产成人在线视频免费播放| 亚洲综合免费观看高清在线观看| 色综合天天性综合| 精品福利一区二区三区| 一本色道久久88综合日韩精品 | 免费成人三级| 午夜激情一区| 国产揄拍国内精品对白| 91片在线免费观看| 欧美午夜一区二区三区免费大片| 欧美日韩一道本| 久色视频在线播放| 777电影在线观看| 日韩免费精品| 久久福利视频一区二区| 洋洋成人永久网站入口| 日本午夜精品视频在线观看| 亚洲精品一级| av小次郎在线| 福利视频在线导航| а√天堂中文在线资源8| 青青久草在线| yjizz视频网站在线播放| 成人在线免费播放视频| 亚洲欧美日韩精品久久久久| 亚洲乱码在线| 最新日韩精品| 亚洲社区在线| 中文字幕在线观看一区二区三区| 韩国v欧美v日本v亚洲| 欧美日韩国产精选| 久久久久久久久久久黄色| 天天操综合网| 黄色成人在线视频| 在线黄色国产视频| 最新av网址在线观看| 国产精品精品久久久| 国产丝袜一区视频在线观看| 亚洲夂夂婷婷色拍ww47| 国产精品一区免费视频| 国产激情久久|