范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

ThreadLocal理解

  ThreadLocal理解
  因为这几天在练习写 reids  锁,涉及使用ThreadLocal  。虽然以前也写过关于ThreadLocal  的学习文档。但是当时学的时候在意的是速度,并没有仔细熟悉和掌握,所以欠债是要还的。
  jdk版本:1.8(都已经出了好高的版本,我还在啃1.8) 代码入手
  先看下面的代码 package com.jmmq.load.jim.test;  public class ThreadLocalTest {      private static final ThreadLocal tl = new ThreadLocal();      public static void main(String[] args) {         Thread thread = Thread.currentThread();         String name = "jimmy";         tl.set(name);         System.out.println(tl.get());     } } --- jimmy
  给人直观的感觉 ThreadLcal  就是一个可以存储数据的容器。完全体现不出来ThreadLocal  的用法,那我们对程序进行改进下package com.jmmq.load.jim.test;  import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;  public class ThreadLocalTest {      private static final ThreadLocal tl = new ThreadLocal();      public static void main(String[] args) {          String name = "jimmy - ";         tl.set(name + Thread.currentThread().getName());          new Thread(() -> {             tl.set("giao giao ~" + Thread.currentThread().getName());             System.out.println(tl.get());           }         ).start();          // 实际开发建议自己写线程池         ExecutorService fixedThreadPool = Executors.newFixedThreadPool(2);          for (int i = 0; i < 3; i++) {             final int index = i + 1;             fixedThreadPool.execute(new Runnable() {                  @Override                 public void run() {                     try {                         tl.set("盖亚 v " + index + " v " + Thread.currentThread().getName());                         // 让线程不同时执行完,以便观察tl内容变化                         Thread.sleep(1000 * (5 - index));                         System.out.println(tl.get());                     } catch (Exception e) {                         // 实际开发禁止使用 e.printStackTrace();                         e.printStackTrace();                     }                 }             });          }          fixedThreadPool.shutdown();         System.out.println(tl.get());     } } -------------- giao giao ~Thread-0 jimmy - main 盖亚 v 2 v pool-1-thread-2 盖亚 v 1 v pool-1-thread-1 盖亚 v 3 v pool-1-thread-2
  这里可以看到不同线程从 ThreadLocal  中取数据的时候取出来的值都是线程自己塞进去的值。源码分析
  一种方式是根据程序进行 debug  看代码如何运行的。
  我这里因为之前有看过所以直接给出部分关键地方进行分析。
  我们从 ThreadLocal.set()  入手看看,这里面到底干了啥。public void set(T value) {     // 1、拿到当前线程     Thread t = Thread.currentThread();     // 2、获取 当前线程中的 threadLocals     ThreadLocalMap map = getMap(t);     if (map != null)         //3-1 将当前线程多为key放在threadLocals,传入的值作为value         map.set(this, value);     else         // 3-2 若当前线程中的 threadLocals为null则创建         createMap(t, value); }
  这里要注意 2  步骤。看下这方法是什么东东ThreadLocalMap getMap(Thread t) {     return t.threadLocals; }
  这个 threadLocals  是什么,继续读Thread类的源码找到属性threadLocals  /* ThreadLocal values pertaining to this thread. This map is maintained * by the ThreadLocal class. */ ThreadLocal.ThreadLocalMap threadLocals = null;
  这样基本就看完了 ThreadLocal.set()  方法了。
  总结起来 就是在 set  的时候是将value  塞进了线程自己独有的属性threadLocals  中,使用当前线程作为key  。
  沿着这个思路来看 ThreadLocal.get()  取数据的时候就是根据当前线程作为key  来查找threadLocals  里面的值。看下源码是否是这么实现的。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(); }
  一目了然。
  一个常见的面试题:
  那在看一眼 ThreadLocal.ThreadLocalMap  是个啥玩意。这里面源码挺多的就不复制过来了。原理和Map有些类似。相信大家一定听过这样一道面试题:为什么  ThreadLocal  可能会导致内存泄露?
  一些没有看过源码的童鞋看网上答案肯定也知道,就是  ThreadLocal  里面采用的是弱引用,所以有可能会出现内存泄漏。
  其实这个若引用时在 ThreadLocalMap  中r如下。至于为什么弱引用可能引起内存泄漏,这个以后在讨论。static class ThreadLocalMap { 	...              static class Entry extends WeakReference> {         /** The value associated with this ThreadLocal. */         Object value;          Entry(ThreadLocal<?> k, Object v) {             super(k);             value = v;         }     }         ...     }

孟晚舟案最新转机,加法官对美国反戈一击,华为充满信心孟晚舟案最后时刻加法官对美国反戈一击华为发声回应表示充满信心据央视新闻2021年8月19号的报道当地时间8月18号下午孟晚舟引渡案在加拿大哥伦比亚省高等法院的审理已全部结束接下来加红米Note11Pro袭来,6000mAh骁龙芯片,售价不足2K?说起红米手机,相信所有人首先想到的就是性价比,自红米成立之后,一直都致力于中低端性价比手机,相比小米数字系统,性价比更高。无论是性能芯片还是续航能力,在同价位之中,红米总能够给予用为什么三国演义等名著很多人看不下去还叫名著呢?名著,故名思意即很有名的著作。三国演义是我國四大名著之一。名著这称谓是早就认定的。你不去看,也不会否定它是名著,就如诺奖作品,你没参加评定,它照样能获奖。你说很多人,一百个,一千个2021中国国际数字博览会展馆黑科技带来全新体验时间折叠数字孪生脑电交互9月6日至8日,以创新发展与数字经济为主题的2021中国国际数字经济博览会将在石家庄(正定)国际会展中心举办。届时,468家企业将在4个室内展馆1个室外展区小牛九号电动车价格为什么卖得贵?跟爱玛雅迪又有什么区别?电动车行业经历了多次洗牌之后,目前剩下都是一些实力较强的品牌,比如爱玛雅迪新日绿源等传统豪强品牌,但也有九号小牛哈啰等互联网品牌赫然在列,这些品牌价格卖得这么贵,背后的原因是什么?经常打游戏刷视频,重度手机使用者,价格23k有哪些手机推荐?文小伊评科技根据题主的需求是需要一款经常用来打游戏刷视频的手机,并且题主本身还是重度的手机使用者,那么对于题主来说这款手机要具备如下的特点必备特质超强性能以及高续航加分配置快充,高爱立信CEO誓言将重新夺回在中国失去的市场份额今年二季度,瑞典电信巨头爱立信在中国市场的销售额骤降六成之多,连带导致公司整体销售额三年来也首次出现了下降。此后又有消息显示,在中国最新一轮的5G设备招标中,爱立信只拿到零星份额。比5G速度快50倍,中国6G技术大获成功,美欧各国坐立不安图为中国6G试验卫星如今中国已经建成了全世界规模最大的5G网络,把美国等西方国家都甩在了身后,而让美国专家紧张的是,在西方还在努力建设5G网络系统的时候,中国的6G技术大获成功,据ETC的技术落后吗?为什么不直接扫描车牌绑定微信或支付宝呢?ETC落后?这玩笑有点大了。很多事情我们不能只是听说就觉得很先进,比如支付宝扫车牌支付过路费,听起来很先进,但是以目前的技术条件来说谈不上先进。支付宝扫车牌支付过路费只是改变了付款为什么TPLINK(普联)从来不公布路由器产品的CPU运行内存闪存等相关参数?都买TP了,还在乎硬件配置么?能用就好我用过的tp虽然硬件不出彩,但稳定性是最好的,没有用坏的,不过它每个型号的版本越靠后缩水越严重曾经的TPLINK几乎霸占了家庭路由的领域,走家鸿蒙3。0来了?华为开发者大会时间已定,这次稳了要说今年的华为高光时刻在哪里,肯定不是刚刚发布的旗舰P50系列,毕竟P50只是一个产品,并没有太多具有革命性的意义。个人觉得,还是当属于在今年六月份举办的鸿蒙发布会了,而在发布会上
VIVO子公司注册资本增至1。2亿,增幅140南方财经5月7日电,企查查APP显示,5月5日,维沃企业管理咨询(海南)有限公司发生工商变更,注册资本由5000万元人民币增至1。2亿元人民币,增幅140。企查查信息显示,该企业成vueVue脚手架消息订阅与发布今天的内容有意思了,朋友们继续对我们之前的案例完善,是这样的我们之前是不是靠props来完成父给子,子给父之间传数据,其实父给子最好的方法就是props但是自给父就不是了,并且今天推特收购案余波不断当地时间5月5日,推特向美国证券交易委员会所提交最新的13D文件显示,马斯克又获得了71。39亿美元的融资承诺,用于收购推特,融资承诺总额已增至272。5亿美元。新的私有化收购财团为什么南美的小山猴,长得像澳洲的袋鼠?5。3知识分子TheIntellectual南美小山猴和澳洲袋鼠导读自物种起源发表以来,演化的思想已经深入人心。全基因组测序技术的飞速发展,使得科学家们能够透过DNA这本生命之书一不要着急买手机!一大波硬件升级,旗舰真换代就要来了关注犟牛,不错过每一篇好文。经过了近20年的发展,智能手机市场如今已经从增量时代,进入到了存量时代。就那么一块有限的蛋糕了,这个品牌多吃一口,另外的品牌自然就会少吃一口。所以,各个六年内营收翻五倍广告依赖度减半马斯克为Twitter描绘宏伟蓝图还未完成Twitter收购案的马斯克已早早为Twitter规划好了未来。据纽约时报当地时间5月6日报道,全球首富埃隆马斯克在近期给投资者的一份报告中展示了他为Twitter描绘的宏国内首个肿瘤数字疗法获批数字疗法产品赛道前景几何?21世纪经济报道记者唐唯珂实习生侯雨汐广州报道肿瘤领域也开始涉及数字疗法,近日首张数字疗法医疗器械二类证获批落地。4月28日,零氪宣布旗下子公司众曦医疗科技的数字疗法产品TH002真正切中用户需求,邦克仕电竞系列新品,让打游戏更爽就在刚刚,邦克仕围绕竞有引力为主题的线上新品发布会刚刚结束,整个系列都是以电竞手游为展开,势必要为更多的手游玩家提供更出色和更舒服的游戏外设而努力,其中新品包含手机散热器手机散热保快播彻底破产了,绝不是欠一个会员,而是一个时代的终结每当提起快播,8090后的朋友一定会回想起通宵看片的经历。但如今,它却已经被吊销营业执照了。自从2011年5月提交破产申请以来,深圳市快播科技有限公司终于完成了全面清算和破产财产分买手机不能太小气,5月份口碑最好的3款手机,用5年也不卡俗话说买的没有卖的精,贵有贵的道理,便宜有便宜的问题。很多人买手机的时候非常小气,这样买手机就很容易入坑了。下面笔者就来盘点下5月份口碑最好的3款机型,用5年也不会卡顿,看完优缺点2000元用iPhone12ProMax是什么体验首先感谢一对小情侣,说头天晚上喝酒喝懵了就把手机摔了,第二天就因为缘分吧拿到了店里回收,来的时候手机摔得惨不忍睹笑哭屏幕后盖摔稀碎,中框也断了,当时插充电器看了一下电流,没一点反应