电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

重新認識Java中的ThreadLocal

瀏覽:5日期:2022-08-11 15:35:30
目錄究竟是啥結構內存泄漏是什么鬼

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

究竟是啥結構

比如我們在代碼中 new 一個 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'; }

這里構造了兩個線程,一個先往里設值,一個后從里取,運行看下結果,

重新認識Java中的ThreadLocal

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

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

寫博客這會我才明白我原來咋會錯得這么離譜,看到第一行代碼 t 就是當前線程,然后第二行就是用這個線程去getMap,然后我是把這個當成從 map 里取值了,其實這里是

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

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

重新認識Java中的ThreadLocal

它其實是線程 Thread 中的一個類型是java.lang.ThreadLocal.ThreadLocalMap的成員變量這是 ThreadLocal 的一個靜態成員變量

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; }} }

全部代碼有點長,只截取了一小部分,然后我們再回頭來分析前面說的 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 是啥,其實是當前這個 ThreadLocal,這里就比較明白了究竟是啥結構,每個線程都會維護自身的 ThreadLocalMap,它是線程的一個成員變量,當創建 ThreadLocal 的時候,進行設值的時候其實是往這個 map 里以 ThreadLocal 作為 key,往里設 value。

內存泄漏是什么鬼

這里又要看下前面的 ThreadLocalMap 結構了,類似 HashMap,它有個 Entry 結構,在設置的時候會先包裝成一個 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();}

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

以上就是詳解Java中的ThreadLocal的詳細內容,更多關于Java ThreadLocal的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 杭州厂房降温,车间降温设备,车间通风降温,厂房降温方案,杭州嘉友实业爽风品牌 | 上海平衡机-单面卧式动平衡机-万向节动平衡机-圈带动平衡机厂家-上海申岢动平衡机制造有限公司 | 特种电缆厂家-硅橡胶耐高温电缆-耐低温补偿导线-安徽万邦特种电缆有限公司 | 天津蒸汽/热水锅炉-电锅炉安装维修直销厂家-天津鑫淼暖通设备有限公司 | 台式核磁共振仪,玻璃软化点测定仪,旋转高温粘度计,测温锥和测温块-上海麟文仪器 | 分子蒸馏设备(短程分子蒸馏装置)_上海达丰仪器 | 天空彩票天下彩,天空彩天空彩票免费资料,天空彩票与你同行开奖,天下彩正版资料大全 | 分子精馏/精馏设备生产厂家-分子蒸馏工艺实验-新诺舜尧(天津)化工设备有限公司 | 丙烷/液氧/液氮气化器,丙烷/液氧/液氮汽化器-无锡舍勒能源科技有限公司 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | 杭州双螺杆挤出机-百科 | 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 捆扎机_气动捆扎机_钢带捆扎机-沈阳海鹞气动钢带捆扎机公司 | 开云(中国)Kaiyun·官方网站 - 登录入口 | 派克防爆伺服电机品牌|国产防爆伺服电机|高低温伺服电机|杭州摩森机电科技有限公司 | 大巴租车平台承接包车,通勤班车,巴士租赁业务 - 鸿鸣巴士 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 扒渣机,铁水扒渣机,钢水扒渣机,铁水捞渣机,钢水捞渣机-烟台盛利达工程技术有限公司 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 阿米巴企业经营-阿米巴咨询管理-阿米巴企业培训-广东键锋企业管理咨询有限公司 | 油液红外光谱仪-油液监测系统-燃油嗅探仪-上海冉超光电科技有限公司 | 灌装封尾机_胶水灌装机_软管灌装封尾机_无锡和博自动化机械制造有限公司 | 宜兴紫砂壶知识分享 - 宜兴壶人 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | AGV无人叉车_激光叉车AGV_仓储AGV小车_AGV无人搬运车-南昌IKV机器人有限公司[官网] | PVC地板|PVC塑胶地板|PVC地板厂家|地板胶|防静电地板-无锡腾方装饰材料有限公司-咨询热线:4008-798-128 | 微型驱动系统解决方案-深圳市兆威机电股份有限公司 | loft装修,上海嘉定酒店式公寓装修公司—曼城装饰 | 智能交通网_智能交通系统_ITS_交通监控_卫星导航_智能交通行业 | 医院专用门厂家报价-医用病房门尺寸大全-抗菌木门品牌推荐 | 冷水机-冰水机-冷冻机-冷风机-本森智能装备(深圳)有限公司 | 全温恒温摇床-水浴气浴恒温摇床-光照恒温培养摇床-常州金坛精达仪器制造有限公司 | 施工电梯_齿条货梯_烟囱电梯_物料提升机-河南大诚机械制造有限公司 | 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 企典软件一站式企业管理平台,可私有、本地化部署!在线CRM客户关系管理系统|移动办公OA管理系统|HR人事管理系统|人力 | 高扬程排污泵_隔膜泵_磁力泵_节能自吸离心水泵厂家-【上海博洋】 | 华禹护栏|锌钢护栏_阳台护栏_护栏厂家-华禹专注阳台护栏、楼梯栏杆、百叶窗、空调架、基坑护栏、道路护栏等锌钢护栏产品的生产销售。 | 众品地板网-地板品牌招商_地板装修设计_地板门户的首选网络媒体。 | DAIKIN电磁阀-意大利ATOS电磁阀-上海乾拓贸易有限公司 | 抖音短视频运营_企业网站建设_网络推广_全网自媒体营销-东莞市凌天信息科技有限公司 | 一体式钢筋扫描仪-楼板测厚仪-裂缝检测仪-泰仕特(北京) | 齿轮减速电机一体机_蜗轮蜗杆减速马达-德国BOSERL齿轮减速机带电机生产厂家 |