浅谈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);

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

相关文章
|
存储 安全 Java
【ThreadLocal】
【ThreadLocal】
|
3月前
|
Java 测试技术 索引
ThreadLocal详解
文章详细讨论了Java中的`ThreadLocal`,包括它的基本使用、定义、内部数据结构`ThreadLocalMap`、主要方法(set、get、remove)的源码解析,以及内存泄漏问题和避免策略。`ThreadLocal`提供了线程局部变量,确保多线程环境下各线程变量的独立性,但不当使用可能导致内存泄漏,因此建议在不再需要`ThreadLocal`变量时调用其`remove`方法。
108 2
ThreadLocal详解
|
5月前
|
Java
ThreadLocal 场景题
ThreadLocal 场景题
36 1
|
6月前
|
存储 Java 数据管理
ThreadLocal的使用
`ThreadLocal`是Java中的线程局部变量工具,确保每个线程都有自己的变量副本,互不干扰。适用于保持线程安全性数据和跨方法共享数据。基本用法包括创建实例、设置和获取值以及清除值。例如,创建ThreadLocal对象后,使用`.set()`设置值,`.get()`获取值,`.remove()`清除值。注意ThreadLocal可能引起内存泄漏,应适时清理,并谨慎使用以避免影响代码可读性和线程安全性。它是多线程编程中实现线程局部数据管理的有效手段。
88 10
|
存储 SQL Java
ThreadLocal的其他应用
request对象跟PageHelper
101 0
|
存储 Java
ThreadLocal相关使用
ThreadLocal相关使用
192 0
ThreadLocal相关使用
|
存储 Java
对threadlocal了解多少?
通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK 中提供的 ThreadLocal 类正是为了解决这样的问题。 ThreadLocal 类主要解决的就是让每个线程绑定自己的值,可以将 ThreadLocal 类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。
|
存储 安全 Java
ThreadLocal 使用详解
ThreadLocal 是线程本地变量。当使用 ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程
543 0
|
Java 应用服务中间件
我把 ThreadLocal 能问的,都写了(下)
我把 ThreadLocal 能问的,都写了(下)
我把 ThreadLocal 能问的,都写了(下)