关于java:ThreadLocalT学习心得

4次阅读

共计 1779 个字符,预计需要花费 5 分钟才能阅读完成。

1、ThreadLocal<T> 介绍:它是 java.lang 包下的类,T 指的是泛型,类型取决于它成员办法中的占位符,ThreadLocal 中有几个比拟罕用成员的办法

&nbsp&nbsp&nbsp&nbsp(1)set(T value) : 配合拦截器应用,在申请解决前进行一些操作,例如把前端页面登陆之后的 id 用 ThreadLocal 中的非凡的数据结构来存储线程的公有数据,称为 “ThreadLocalMap”,每个线程领有本人的 ThreadLocalMap,因而不同线程对同一个 ThreadLocal 对象的操作是互相独立的,互不烦扰。

&nbsp&nbsp&nbsp&nbsp(2)T get(): 用于获取以后线程中与 ThreadLocal 对象关联的值

&nbsp&nbsp&nbsp&nbsp(3)remove: 删除 ThreadLocalMap 所有的数据

2 会有内存透露问题吗?怎么解?
&nbsp&nbsp&nbsp 如果在应用 ThreadLocal 的过程中不留神开释资源,可能会导致内存透露的问题。这是因为 ThreadLocal 应用了一个非凡的数据结构 ThreadLocalMap 来存储每个线程的公有数据,而 ThreadLocalMap 是弱援用类型的键值对。

&nbsp&nbsp&nbsp 当线程完结时,ThreadLocalMap 中与该线程关联的键值对并不会主动被清理,如果 ThreadLocal 对象没有手动删除或调用 remove 办法进行清理,那么对应的键值对就会始终存在于 ThreadLocalMap 中,这样就会导致内存透露。

为了防止 ThreadLocal 的内存透露问题,能够采取以下两种罕用的解决方案:
&nbsp&nbsp&nbsp(1) 及时清理:在应用完 ThreadLocal 后,应该手动调用 remove 办法将其与以后线程关联的键值对从 ThreadLocalMap 中移除。能够应用 ThreadLocal 的 remove 办法或者应用 try-finally 语句块来确保清理操作肯定会执行。
&nbsp&nbsp&nbsp(2) 应用 InheritableThreadLocal:InheritableThreadLocal 是 ThreadLocal 的一个子类,容许子线程继承父线程设置的 ThreadLocal 值。应用 InheritableThreadLocal 的益处是,能够防止在子线程中从新设置 ThreadLocal 值,从而缩小了内存透露的危险。

补充:
&nbsp&nbsp&nbsp 强援用(Strong Reference):强援用是最常见的援用类型,在代码中间接通过变量进行援用。只有存在强援用指向一个对象,垃圾回收器就不会回收该对象。即便内存不足时,零碎也不会回收强援用对象。例如:
Object obj = new Object(); // obj 为强援用

&nbsp&nbsp&nbsp 软援用(Soft Reference):软援用用于形容一些还有用但非必须的对象。当内存不足时,垃圾回收器可能会回收软援用对象。能够利用软援用来实现内存敏感的高速缓存等场景。例如:
SoftReference<Object> softRef = new SoftReference<>(obj); // softRef 为软援用

&nbsp&nbsp&nbsp 弱援用(Weak Reference):弱援用的生命周期更短暂,当垃圾回收器运行时,无论内存是否短缺,都会对弱援用对象进行回收。弱援用通常用于实现某种模式的缓存,当没有其余强援用指向对象时,弱援用会被主动回收。例如:
WeakReference<Object> weakRef = new WeakReference<>(obj); // weakRef 为弱援用

&nbsp&nbsp&nbsp 虚援用(Phantom Reference):虚援用是最弱的一种援用类型,简直没有理论的理论利用场景。虚援用的次要作用是跟踪对象被垃圾回收器回收的过程。虚援用的 get 办法始终返回 null,而且无奈通过虚援用获取到对象,只能通过援用队列(ReferenceQueue)来判断对象是否被垃圾回收器回收。
PhantomReference<Object> phantomRef = new PhantomReference<>(obj, referenceQueue); // phantomRef 为虚援用

正文完
 0