一 ThreadLocal概念
ThreadLocal学名线程本地变量,顾名思义,那就是私有的线程变量
二 ThreadLocal源码分析
private void set(ThreadLocal key, Object value) {
// We don't use a fast path as with get() because it is at
// least as common to use set() to create new entries as
// it is to replace existing ones, in which case, a fast
// path would fail more often than not.
Entry[] tab = table;
int len = tab.length;
int i = key.threadLocalHashCode & (len-1);
我们看到其实他的数据结构是散列表的数组,有没有想起老朋友HashMap,但是,嘿嘿,他们不一样。
接着我们看看组成他的数组,数组的类型是Entry,这个是什么东西呢,我们看看他的源码
static class Entry extends WeakReference {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal k, Object v) {
super(k);
value = v;
}
}
## 三 引用类别
大家看到了继承WeakReference
了吗?小伙伴们知道他是啥吗? 他就是java的几种引用之一,java的引用分为
强引用,软引用,弱引用以及虚引用
强引用
Object obj = new Object(); //只要obj还指向Object对象,Object对象就不会被回收
只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了
软引用
SoftReference<byte[]> sr = new SoftReference<>(buff);
软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等
- 弱引用
弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。在 JDK1.2 之后,用
java.lang.ref.WeakReference
来表示弱引用 - 虚引用
PhantomReference
是一种极弱的引用关系,定义完成后就无法通过该引用获取对象,为对象设定虚引用的唯一目的就是为了对象被回收时收到一个系统通知。