网站的推广优化,蝶恋直播视频在线观看,高校校园网站建设评比自评,浏网站建设补贴推荐链接#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD… 推荐链接 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoDB】 总结——》【Elasticsearch】 Java——》ThreadLocal 一、概念二、源码三、内部结构四、特点五、内存泄漏问题1、现象2、解决方案 六、内存泄漏案例七、保证原子性 一、概念
ThreadLocal可以理解为线程本地变量他会在每个线程都创建一个副本那么在线程之间访问内部副本变量就行了做到了线程之间互相隔离相比于synchronized的做法是用空间来换时间。ThreadLocal的本质就是一个MapThreadLocal做为key将一个数据和本地线程绑定在一起。
二、源码
ThreadLocal有一个静态内部类ThreadLocalMapThreadLocalMap又包含了一个Entry数组Entry本身是一个弱引用他的key是指向ThreadLocal的弱引用Entry具备了保存key value键值对的能力。
三、内部结构 四、特点
每个Thread中都存储着一个成员变量ThreadLocalMapThreadLocal本身不存储数据像是一个工具类基于ThreadLocal去操作ThreadLocalMapThreadLocalMap本身就是基于Entry[]实现的因为一个线程可以绑定多个ThreadLocal这样一来可能需要存储多个数据所以采用Entry[]的形式实现。每一个现程都自己独立的ThreadLocalMap再基于ThreadLocal对象本身作为key对value进行存取ThreadLocalMap的key是一个弱引用弱引用的目的是为了防止内存泄露如果是强引用那么ThreadLocal对象除非线程结束否则始终无法被回收弱引用则会在下一次GC的时候被回收
五、内存泄漏问题 Java中4种引用 强引用OOM也不清除 软引用内存不足清除 弱引用只要GC就清除 虚引用拿不到引用构建出来就凉凉~~ 1、现象
假如ThreadLocal对象被回收之后key因为弱引用也会被GC回收掉同时线程还没有被回收entry中就存在key为null但value有值的entry对象但是内存中的value无法被获取到同时也无法被回收就会导致内存泄漏。
2、解决方案
使用TheadLocal完毕后调用remove方法删除Entry对象。
六、内存泄漏案例 参考链接Java——》内存泄露案例 七、保证原子性
ThreadLocal保证原子性的方式是不让多线程去操作临界资源让每个线程去操作属于自己的数据。
static ThreadLocal tl1 new ThreadLocal();
static ThreadLocal tl2 new ThreadLocal();public static void main(String[] args) {tl1.set(123);tl2.set(456);Thread t1 new Thread(() - {System.out.println(t1: tl1.get());System.out.println(t1: tl2.get());});t1.start();System.out.println(main: tl1.get());System.out.println(main: tl2.get());
}