ThreadLocal

说一下ThreadLocal

1、是什么?

ThreadLocal是java提供的线程本地存储的机制,可以利用该机制,将某个数据缓存在线程中,该线程可以在任意时刻,任意方法获取该值

2、底层?

ThreadLocal底层是通过ThreadLocalMap来实现的,每个Thread对象,都有一个ThreadLocalMap,Map 的key 存的是 ThreadLocal 对象,value 存的是需要缓存的数据。

3、存在的问题?

在线程池场景下使用ThreadLocal可能造成内存泄露,因为线程中有ThradLocalMap,即线程指向了ThreadLocalMap,ThreadLocalMap又指向了ThreadLocal对象,线程池中的线程对象是不会回收的,所以,ThreadLocalMap是不会回收的,该ThreadLocal也不会回收。该线程去执行任务二时,任务二会有新的ThreadLocal对象,对于任务二来说,任务一的ThreadLocal对象和value是没用的,但是仍然存在。久而久之,就可能造成内存泄露。

4、应用场景?

线程池下使用ThreadLocal注意

我们需要在线程执行完后,手动的调用ThreadLocal 中的 remove()线程中的 ThreadLocal对象

ThreadLocal的主要作用:

  • 持有线程资源,供线程的各个部分使用
  • 帮助维护多线程共享资源的一致性
  • 线程安全的一种方案

ThreadLocal为什么要设计为static

private static ThreadLocal<String> connThreadLocal = new ThreadLocal<String>();

理由

为了避免重复创建TSO(thread specific object )即与线程相关的变量

需要注意的是:无法解决共享对象的问题

static 定义的类变量本来是可以进行变量共享的,但是ThreadLocal根除了对变量的共享

分析

​ 一个ThreadLocal实例对应当前线程的一个TSO实例。因此,如果把ThreadLocal声明为某个类的实例变量,而不是静态变量,那么每创建一个该类的实例,就会导致一个新的TSO实例被创建,因此这个线程访问的时候,即便不会导致错误(同一个线程中创建了多个拥有ThreadLocal属性的对象,这个线程读取的时候可能读到不是相同的值),也会创建重复的对象。因此,一般我们将ThreadLocal定义为static的。

​ 设计为static后,由于ThreadLocal是某一个类的静态变量。因此,只要相应的类没有被垃圾回收掉,那么这个类就会持有相应的ThreadLocal实例的引用。

全部评论

相关推荐

点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务