浅谈ThreadLocal

简介: 浅谈ThreadLocal

ThreadLocal是多线程中对于解决线程安全的一个操作类,它会为每个线程都分配一个独立的线程副本从而解决了变量并发访问冲突的问题。ThreadLocal 同时实现了线程内的资源共享

ThreadLocal基本使用

 

三个主要方法:

- set(value) 设置值

- get() 获取值

- remove() 清除值

关于ThreadLocal-内存泄露问题

Java对象中的四种引用类型:强引用、软引用、弱引用、虚引用

强引用:最为普通的引用方式,表示一个对象处于有用且必须的状态,如果一个对象具有强引用,则GC并不会回收它。即便堆中内存不足了,宁可出现OOM,也不会对其进行回收

弱引用:表示一个对象处于可能有用且非必须的状态。在GC线程扫描内存区域时,一旦发现弱引用,就会回收到弱引用相关联的对象。对于弱引用的回收,无关内存区域是否足够,一旦发现则会被回收

每一个Thread维护一个ThreadLocalMap,在ThreadLocalMap中的Entry对象继承了WeakReference。其中key为使用弱引用的ThreadLocal实例,value为线程变量的副本

在使用ThreadLocal的时候,强烈建议:务必手动remove

Ps:

Java中,引用(Reference)是用来在程序中访问对象的一种方式。Java中的引用可以分为四种类型:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。

强引用(Strong Reference):是最常见的引用类型,通过关键字"new"创建的对象默认就是强引用。只要强引用存在,垃圾回收器就不会回收被引用的对象。例如:

Object obj = new Object();

软引用(Soft Reference):软引用是一种相对强引用更加弱化的引用关系。当系统内存不足时,垃圾回收器会尝试回收软引用对象。在Java中,可以使用SoftReference类来创建软引用。例如:

SoftReference<Object> softRef = new SoftReference<>(new Object());

弱引用(Weak Reference):弱引用比软引用更弱,只有当对象被弱引用关联到时,垃圾回收器在下一次回收时就会回收该对象。在Java中,可以使用WeakReference类来创建弱引用。例如:

WeakReference<Object> weakRef = new WeakReference<>(new Object());

虚引用(Phantom Reference):虚引用是最弱的一种引用,无法通过虚引用访问对象。它的主要作用是在对象被垃圾回收时收到一个系统通知。在Java中,可以使用PhantomReference类来创建虚引用。例如:

ReferenceQueue<Object> queue = new ReferenceQueue<>();

PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), queue);

这些不同类型的引用有助于在特定场景下更灵活地管理对象的生命周期。软引用和弱引用通常用于缓存和内存敏感的应用,虚引用则可以用于跟踪对象被垃圾回收的状态。

相关文章
|
4月前
|
Java 测试技术 索引
ThreadLocal详解
文章详细讨论了Java中的`ThreadLocal`,包括它的基本使用、定义、内部数据结构`ThreadLocalMap`、主要方法(set、get、remove)的源码解析,以及内存泄漏问题和避免策略。`ThreadLocal`提供了线程局部变量,确保多线程环境下各线程变量的独立性,但不当使用可能导致内存泄漏,因此建议在不再需要`ThreadLocal`变量时调用其`remove`方法。
124 2
ThreadLocal详解
|
7月前
|
存储 Java
ThreadLocal 有什么用
ThreadLocal 有什么用
57 0
|
存储 算法 安全
深入详解ThreadLocal
在我们日常的并发编程中,有一种神奇的机制在静悄悄地为我们解决着各种看似棘手的问题,它就是 ThreadLocal 。
21524 9
深入详解ThreadLocal
|
存储 Java
|
存储 Java 数据库连接
对ThreadLocal的一点了解
ThreadLocal是线程变量,它为每个线程提供单独的存储空间。其主要作用是做线程间的数据隔离,也可以用于在同一个线程间方便地进行数据共享。(对于多线程资源共享,加锁机制采用“时间换空间”,ThreadLocal采用“空间换时间”)
132 0
|
存储 Java
ThreadLocal相关使用
ThreadLocal相关使用
199 0
ThreadLocal相关使用
|
存储 安全 Java
ThreadLocal 使用详解
ThreadLocal 是线程本地变量。当使用 ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程
559 0
|
存储 算法 安全
深入理解 ThreadLocal
深入理解 ThreadLocal
深入理解 ThreadLocal
|
算法 安全 Java
这4种ThreadLocal你都知道吗?
这4种ThreadLocal你都知道吗?
113 0
这4种ThreadLocal你都知道吗?