日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

重新認(rèn)識(shí)Java中的ThreadLocal

瀏覽:20日期:2022-08-11 15:35:30
目錄究竟是啥結(jié)構(gòu)內(nèi)存泄漏是什么鬼

說來也慚愧,這個(gè) ThreadLocal 其實(shí)一直都是一知半解,而且看了一下之后還發(fā)現(xiàn)記錯(cuò)了,所以還是記錄下原先記憶里的都是反過來,一個(gè) ThreadLocal 是里面按照 thread 作為 key,存儲(chǔ)線程內(nèi)容的,真的是半解都米有,完全是錯(cuò)的,這樣就得用 concurrentHashMap 這種去存儲(chǔ)并且要鎖定線程了,然后內(nèi)容也只能存一個(gè)了,想想簡(jiǎn)直智障

究竟是啥結(jié)構(gòu)

比如我們?cè)诖a中 new 一個(gè) ThreadLocal,

public static void main(String[] args) {ThreadLocal<Man> tl = new ThreadLocal<>();new Thread(() -> { try {TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) {e.printStackTrace(); } System.out.println(tl.get());}).start();new Thread(() -> { try {TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) {e.printStackTrace(); } tl.set(new Man());}).start(); } static class Man {String name = 'nick'; }

這里構(gòu)造了兩個(gè)線程,一個(gè)先往里設(shè)值,一個(gè)后從里取,運(yùn)行看下結(jié)果,

重新認(rèn)識(shí)Java中的ThreadLocal

知道這個(gè)用法的話肯定知道是取不到值的,只是具體的原理原來搞錯(cuò)了,我們來看下設(shè)值 set 方法

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

寫博客這會(huì)我才明白我原來咋會(huì)錯(cuò)得這么離譜,看到第一行代碼 t 就是當(dāng)前線程,然后第二行就是用這個(gè)線程去getMap,然后我是把這個(gè)當(dāng)成從 map 里取值了,其實(shí)這里是

ThreadLocalMap getMap(Thread t) { return t.threadLocals;}

獲取 t 的 threadLocals 成員變量,那這個(gè) threadLocals 又是啥呢

重新認(rèn)識(shí)Java中的ThreadLocal

它其實(shí)是線程 Thread 中的一個(gè)類型是java.lang.ThreadLocal.ThreadLocalMap的成員變量這是 ThreadLocal 的一個(gè)靜態(tài)成員變量

static class ThreadLocalMap {/** * The entries in this hash map extend WeakReference, using * its main ref field as the key (which is always a * ThreadLocal object). Note that null keys (i.e. entry.get() * == null) mean that the key is no longer referenced, so the * entry can be expunged from table. Such entries are referred to * as 'stale entries' in the code that follows. */static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) {super(k);value = v; }} }

全部代碼有點(diǎn)長(zhǎng),只截取了一小部分,然后我們?cè)倩仡^來分析前面說的 set 過程,再 copy 下代碼

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

獲取到 map 以后呢,如果 map 不為空,就往 map 里 set,這里注意 key 是啥,其實(shí)是當(dāng)前這個(gè) ThreadLocal,這里就比較明白了究竟是啥結(jié)構(gòu),每個(gè)線程都會(huì)維護(hù)自身的 ThreadLocalMap,它是線程的一個(gè)成員變量,當(dāng)創(chuàng)建 ThreadLocal 的時(shí)候,進(jìn)行設(shè)值的時(shí)候其實(shí)是往這個(gè) map 里以 ThreadLocal 作為 key,往里設(shè) value。

內(nèi)存泄漏是什么鬼

這里又要看下前面的 ThreadLocalMap 結(jié)構(gòu)了,類似 HashMap,它有個(gè) Entry 結(jié)構(gòu),在設(shè)置的時(shí)候會(huì)先包裝成一個(gè) Entry

private void set(ThreadLocal<?> key, Object value) {// We don’t use a fast path as with get() because it is at// least as common to use set() to create new entries as// it is to replace existing ones, in which case, a fast// path would fail more often than not.Entry[] tab = table;int len = tab.length;int i = key.threadLocalHashCode & (len-1);for (Entry e = tab[i]; e != null; e = tab[i = nextIndex(i, len)]) { ThreadLocal<?> k = e.get(); if (k == key) {e.value = value;return; } if (k == null) {replaceStaleEntry(key, value, i);return; }}tab[i] = new Entry(key, value);int sz = ++size;if (!cleanSomeSlots(i, sz) && sz >= threshold) rehash();}

這里其實(shí)比較重要的就是前面的 Entry 的構(gòu)造方法,Entry 是個(gè) WeakReference 的子類,然后在構(gòu)造方法里可以看到 key 會(huì)被包裝成一個(gè)弱引用,這里為什么使用弱引用,其實(shí)是方便這個(gè) key 被回收,如果前面的 ThreadLocal tl實(shí)例被設(shè)置成 null 了,如果這里是直接的強(qiáng)引用的話,就只能等到線程整個(gè)回收了,但是其實(shí)是弱引用也會(huì)有問題,主要是因?yàn)檫@個(gè) value,如果在 ThreadLocal tl 被設(shè)置成 null 了,那么其實(shí)這個(gè) value 就會(huì)沒法被訪問到,所以最好的操作還是在使用完了就 remove 掉

以上就是詳解Java中的ThreadLocal的詳細(xì)內(nèi)容,更多關(guān)于Java ThreadLocal的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品a级| 欧美aⅴ一区二区三区视频| 国产免费久久| 视频一区二区国产| 日本激情一区| 精品国产中文字幕第一页| 国产精品欧美在线观看| 国产精品对白| 午夜电影亚洲| 热久久久久久| 超碰成人av| 久久国产精品免费一区二区三区 | 欧美一级二级视频| 国产91在线精品| 国产欧美日韩一级| 亚洲区国产区| 日本一区免费网站| 日韩精品视频一区二区三区| 麻豆久久一区二区| 国产专区一区| 久久亚洲风情| 韩日一区二区| 亚洲最新无码中文字幕久久| 四虎国产精品免费观看| 美国三级日本三级久久99 | 99精品在线免费在线观看| 国产剧情在线观看一区| 久久精品在线| 精品在线99| 亚洲毛片视频| 国产精品大片| 久久国产电影| 国产精品久久久网站| 国产91久久精品一区二区| 日韩在线a电影| 色综合五月天| 亚洲日产av中文字幕| 92国产精品| 亚洲精品一二| 国产白浆在线免费观看| 一级成人国产| 日韩三区免费| 国产亚洲欧美日韩在线观看一区二区| 午夜精品成人av| 欧美日韩亚洲一区三区| 亚洲精品在线影院| 欧美精品影院| 亚洲精品一区二区在线看| 亚洲男女自偷自拍| 久久免费大视频| 国产日韩电影| 日本精品黄色| 日本午夜精品| 黄色在线一区| 成人国产精品| 国产欧美一区二区三区精品观看| 国产综合色产| а√天堂8资源在线| 日韩在线电影| 99在线|亚洲一区二区| 成午夜精品一区二区三区软件| 亚洲无线观看| av亚洲在线观看| 国产精品成人a在线观看| 色综合视频一区二区三区日韩| 久久一区二区中文字幕| 久久亚洲国产精品尤物| 日韩一区二区三区免费视频| 日韩亚洲国产欧美| 国产一区二区三区四区大秀| 日韩激情综合| 欧美综合另类| 中文字幕高清在线播放| 国产精品久av福利在线观看| 日本欧美在线看| 在线亚洲精品| 狠狠久久婷婷| 欧美久久精品一级c片| 三上悠亚国产精品一区二区三区| 日韩影院在线观看| 婷婷色综合网| 国产综合亚洲精品一区二| 久久人人精品| 电影亚洲精品噜噜在线观看| 98精品视频| 国产成人黄色| 成人一区而且| 国产99在线| 国产va在线视频| 麻豆91精品视频| 久久精品99国产精品| 啪啪国产精品| 亚洲精品激情| 亚洲香蕉久久| 婷婷国产精品| 免费观看久久久4p| 日韩av资源网| 国际精品欧美精品| 九色porny丨国产首页在线| 国产亚洲欧美日韩在线观看一区二区| 国产v日韩v欧美v| 久久99伊人| 快she精品国产999| 国产日韩欧美一区在线| 久久中文字幕一区二区三区| 日本午夜大片a在线观看| 美女视频黄久久| 国产精品v亚洲精品v日韩精品| 999在线观看精品免费不卡网站| 亚洲人成毛片在线播放女女| 91一区二区三区四区| 麻豆国产精品视频| 国产一区二区三区久久| 国产一区二区三区四区大秀| 精品日韩一区| 电影亚洲精品噜噜在线观看| 国精品一区二区| 日韩在线黄色| 国产欧美一区二区三区国产幕精品| 欧美日韩视频免费看| 久久精品天堂| 中文字幕在线视频网站| 蜜臀av一区二区在线免费观看| 人人爽香蕉精品| 日韩av一二三| 亚洲v天堂v手机在线| 中文欧美日韩| 亚洲综合另类| 亚洲开心激情| 国产一区福利| 国产高清久久| 日韩av资源网| 国产精品色在线网站| 成人羞羞在线观看网站| 日韩不卡视频在线观看| 日本不卡的三区四区五区| 日韩在线一二三区| 国产欧美自拍| 日本不卡中文字幕| 日韩美女精品| 久久理论电影| 精品三级在线| 日韩一二三区在线观看| 亚洲欧美日本日韩| 午夜欧美巨大性欧美巨大| 国产成人1区| 捆绑调教美女网站视频一区| 国产精品日本一区二区不卡视频 | 天堂俺去俺来也www久久婷婷| 蜜臀av亚洲一区中文字幕| 亚洲制服一区| 亚洲神马久久| 日韩高清一级| 欧美精品一线| 国产亚洲精品美女久久| 蜜臀久久99精品久久久画质超高清| 久久这里只有精品一区二区| 给我免费播放日韩视频| 亚洲美洲欧洲综合国产一区| 日韩欧美三区| 亚洲一级少妇| 69堂精品视频在线播放| 蜜臀久久精品| 青草综合视频| 免费观看不卡av| 国产欧美一区二区精品久久久| 亚洲欧美伊人| 麻豆成人在线观看| 视频一区二区中文字幕| 精品久久精品| 日韩高清在线一区| 亚洲午夜黄色| 精品国产中文字幕第一页| 丝袜脚交一区二区| 精品久久久网| 7777精品| 免费观看日韩电影| 亚洲一级二级| 久久天堂影院| 日韩精品视频在线看| 蜜桃视频欧美| 国内精品亚洲| 国产精品免费大片| 午夜在线精品| 久久九九电影| 精品国产美女a久久9999| 日本视频中文字幕一区二区三区| 99久久激情| 国产精品久久久久久久久久10秀| 日韩精品中文字幕一区二区| 黄色日韩精品| 久久国产日本精品| 免费在线欧美黄色| 欧美三级第一页| 日韩av电影一区| 日韩中文字幕一区二区高清99| 中文精品在线| 99在线观看免费视频精品观看| 日韩欧美一区二区三区在线视频 | 亚洲人妖在线|