关于什么是ThreadLocal以及他的用处

我理解的ThreaLocal就是内存中有一个变量,每个线程都要拿过来这个变量,但是他们自己去操作自己拿到的那一份变量,这些变量都是一个东西,但是在不同的线程下会有不同的数值,类似CS go里每个人的血量子弹等

ThreadLocal的API

在使用ThreadLocal时,我们需要先初始化一个变量,我们可以选择initialValue或者withInitial方法。我们应更多的配合Lambda表达式去使用withInitial方法,这样更方便,我们推荐用static来修饰threadlocal

/**** 看每个销售员可以出售多少套房子*/
class House{//public static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier)//withInitial(Supplier<? extends S> supplier):创建线程局部变量//ThreadLocal本地线程变量,线程自带的变量副本static ThreadLocal<Integer> threadLocal=ThreadLocal.withInitial(()->0);public void saleHouse(){//T get():返回当前线程的此线程局部变量的副本中的值。Integer value = threadLocal.get();value++;//void set(T value):将当前线程的此线程局部变量的副本设置为指定的值。threadLocal.set(value);}
}
public class ThreadLocalDemo {public static void main(String[] args) {House house = new House();new Thread(()->{try{for (int i = 1; i <=3; i++) {house.saleHouse();}System.out.println(Thread.currentThread().getName()+"\t"+"卖出:"+house.threadLocal.get());}catch (Exception e){e.getStackTrace();}finally {//void remove():删除此线程局部变量的当前线程的值//在阿里巴巴手册中有说明,尽量在代理中使用try-finally块进行回收house.threadLocal.remove();//下面获取到的值是线程的初始值0System.out.println("**********"+house.threadLocal.get());}},"t1").start();new Thread(()->{try{for (int i = 1; i <=5; i++) {house.saleHouse();}System.out.println(Thread.currentThread().getName()+"\t"+"卖出:"+house.threadLocal.get());}catch (Exception e){e.getStackTrace();}finally {house.threadLocal.remove();}},"t2").start();new Thread(()->{try{for (int i = 1; i <=8; i++) {house.saleHouse();}System.out.println(Thread.currentThread().getName()+"\t"+"卖出:"+house.threadLocal.get());}catch (Exception e){e.getStackTrace();}finally {house.threadLocal.remove();}},"t3").start();System.out.println(Thread.currentThread().getName()+"\t"+"卖出了:"+house.threadLocal.get());}
}
/*** t1 卖出:3* t2    卖出:5* **********0* main 卖出了:0* t3   卖出:8* */

接下来是底层的一些知识

1.四大引用都是什么

2.为什么平时推荐调用.remove方法,线程池的情况下一定要调用.remove呢

其实在很多真实的业务场景来看,其实不去remove也没有关系。
原因有下:
1、一般ThreadLocal创建出来时,一般都是强引用,而且是共享资源,这时ThreadLocalMap里面的key是不会有gc的场景的,除非创建ThreadLocal这个线程也没了。
2、ThreadLocalMap是一个Thread下面的属性,若是Thread死了,其实是对应的ThreadLocalMap都会被回收,不会有root根能索引到ThreadLocalMap里面的value的,这时value也会被回收。

但是,也要值得注意的是,现在很多线程创建都是线程池的模式,也就是说可能线程创建出来后,会被一直重复使用,不会短时间内死去(所以ThreadLocalMap指向的对象也不会gc),这时需要注意若是 ThreadLocal 对象的强引用是否有置为null的操作,或者说创建 ThreadLocal的线程死掉了。就有可能出现内存泄漏的情况。

ThreadLocal学习笔记相关推荐

  1. springmvc学习笔记--Interceptor机制和实践

    前言: Spring的AOP理念, 以及j2ee中责任链(过滤器链)的设计模式, 确实深入人心, 处处可以看到它的身影. 这次借项目空闲, 来总结一下SpringMVC的Interceptor机制, ...

  2. Python学习笔记(六)

    1. IO编程 1.1 文件读写 1.2 StringIO和BytesIO 1.3 操作文件和目录 1.4 序列化 2. 进程和线程 2.1 多进程 2.2 多线程 2.3 ThreadLocal 2 ...

  3. 《Go语言圣经》学习笔记 第九章 基于共享变量的并发

    <Go语言圣经>学习笔记 第九章 基于共享变量的并发 目录 竞争条件 sync.Mutex互斥锁 syn.RWMutex读写锁 内存同步 syn.Once初始化 竞争条件检测 示例:并发的 ...

  4. Spring源码学习笔记:经典设计模式之代理模式

    1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 0.代理模式(Proxy Pattern) 指为其他对象提供一种代理,以控制对这个对象的访问.代理对象在客户端 ...

  5. java多线程学习笔记。

    java多线程学习笔记 线程的优缺点: 多线程的好处: 充分利用多处理核心,提高资源的利用率和吞吐量. 提高接口的响应效率,异步系统工作. 线程的风险: 安全危险(竞争条件):什么坏事都没有发生.在没 ...

  6. Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年

    Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 第 9 章 异常处理 9.1 异 ...

  7. 学习笔记:Java 并发编程①_基础知识入门

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 视频下载: ...

  8. 【代码质量】-阿里巴巴java开发手册(代码质量提升神器)学习笔记

    前言:<阿里巴巴 Java 开发手册>是阿里巴巴集团技术团队的集体智慧结晶和经验总结,有了这些前人总结的经验,可以帮助我们写出高质量的代码,同时可以减少Bug数量,少踩坑,提高代码的可读性 ...

  9. Redis学习笔记(实战篇)(自用)

    Redis学习笔记(实战篇)(自用) 本文根据黑马程序员的课程资料与百度搜索的资料共同整理所得,仅用于学习使用,如有侵权,请联系删除 文章目录 Redis学习笔记(实战篇)(自用) 1.基于Sessi ...

最新文章

  1. rest服务器性能,基于真实应用环境下的 WEB REST API 性能测试
  2. linux命令——tar
  3. Spark1.0 安装
  4. SQL重置数据表id
  5. Stanford NLP
  6. Java中线程池,你真的会用吗
  7. Python+Pandas读取Excel文件分析关系最好的两个演员
  8. 21天战拖记——Day6:复习阶段性完成!(2014-05-09)
  9. 好程序员Java分享JVM类加载机制
  10. 隐私计算头条周刊(11.6-11.12)
  11. [CTF] 攻防世界MISC高手区部分题目WriteUp
  12. 2018,来年只剩追忆
  13. PermissionError: [WinError 5] 拒绝访问。
  14. 当WebRTC Pion示例无音频流的时候,如何添加音频模块并通过浏览器播放?
  15. 什么是盒模型(标准盒模型,怪异盒模型)
  16. 远程调用中间件RPC
  17. GA-LSTM的国内外研究现状
  18. matlab学生试用版,免费试用MATLAB
  19. 站群教程SEO推广(SEO教程)
  20. 【智能开发】血压计方案设计与硬件开发

热门文章

  1. 最近,又有人在谈论Android的前景了!
  2. 如何把普通的五比四的照片做成5寸照片
  3. 16春季计算机应用基础,西交16春季《计算机应用基础》在线作业及答案
  4. 编程算法 - 大整数乘法
  5. Franka Emika Panda机械臂规划路径时,rviz中手爪显示碰撞
  6. 第三章 项目立项管理
  7. 沪漂程序媛妹子的一天...
  8. SAP access 破解
  9. Aftereffect中英文切换技巧
  10. java swing实现图文混排_跟我学Java Swing之游戏设计(4)