ThreadLocal学习笔记
关于什么是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学习笔记相关推荐
- springmvc学习笔记--Interceptor机制和实践
前言: Spring的AOP理念, 以及j2ee中责任链(过滤器链)的设计模式, 确实深入人心, 处处可以看到它的身影. 这次借项目空闲, 来总结一下SpringMVC的Interceptor机制, ...
- Python学习笔记(六)
1. IO编程 1.1 文件读写 1.2 StringIO和BytesIO 1.3 操作文件和目录 1.4 序列化 2. 进程和线程 2.1 多进程 2.2 多线程 2.3 ThreadLocal 2 ...
- 《Go语言圣经》学习笔记 第九章 基于共享变量的并发
<Go语言圣经>学习笔记 第九章 基于共享变量的并发 目录 竞争条件 sync.Mutex互斥锁 syn.RWMutex读写锁 内存同步 syn.Once初始化 竞争条件检测 示例:并发的 ...
- Spring源码学习笔记:经典设计模式之代理模式
1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 0.代理模式(Proxy Pattern) 指为其他对象提供一种代理,以控制对这个对象的访问.代理对象在客户端 ...
- java多线程学习笔记。
java多线程学习笔记 线程的优缺点: 多线程的好处: 充分利用多处理核心,提高资源的利用率和吞吐量. 提高接口的响应效率,异步系统工作. 线程的风险: 安全危险(竞争条件):什么坏事都没有发生.在没 ...
- Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年
Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 第 9 章 异常处理 9.1 异 ...
- 学习笔记:Java 并发编程①_基础知识入门
若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 视频下载: ...
- 【代码质量】-阿里巴巴java开发手册(代码质量提升神器)学习笔记
前言:<阿里巴巴 Java 开发手册>是阿里巴巴集团技术团队的集体智慧结晶和经验总结,有了这些前人总结的经验,可以帮助我们写出高质量的代码,同时可以减少Bug数量,少踩坑,提高代码的可读性 ...
- Redis学习笔记(实战篇)(自用)
Redis学习笔记(实战篇)(自用) 本文根据黑马程序员的课程资料与百度搜索的资料共同整理所得,仅用于学习使用,如有侵权,请联系删除 文章目录 Redis学习笔记(实战篇)(自用) 1.基于Sessi ...
最新文章
- rest服务器性能,基于真实应用环境下的 WEB REST API 性能测试
- linux命令——tar
- Spark1.0 安装
- SQL重置数据表id
- Stanford NLP
- Java中线程池,你真的会用吗
- Python+Pandas读取Excel文件分析关系最好的两个演员
- 21天战拖记——Day6:复习阶段性完成!(2014-05-09)
- 好程序员Java分享JVM类加载机制
- 隐私计算头条周刊(11.6-11.12)
- [CTF] 攻防世界MISC高手区部分题目WriteUp
- 2018,来年只剩追忆
- PermissionError: [WinError 5] 拒绝访问。
- 当WebRTC Pion示例无音频流的时候,如何添加音频模块并通过浏览器播放?
- 什么是盒模型(标准盒模型,怪异盒模型)
- 远程调用中间件RPC
- GA-LSTM的国内外研究现状
- matlab学生试用版,免费试用MATLAB
- 站群教程SEO推广(SEO教程)
- 【智能开发】血压计方案设计与硬件开发