引用的四种类型:
1. 强引用 (strong refrence): new一个对象这种产生的引用就是强引用
2. 软引用(soft refrence):当jvm堆内存不足时,会产生oom错误时,会回收这部分内存,适合做缓存
3. 弱引用(weak refrence):当不存在强引用时,只要发生GC,就会回收这部分内存 试用于跟踪对象的回收,避免内存泄漏
4. 虚引用(phantom refence): 比弱引用更弱的一种引用,通过get方法都拿不到对应的对象 使用场景上感觉和弱引用很像 这里留一个todo 等知道后再来完善
ThreadLocal:
1) 基本用法:
public class ThreadLocalTest {
static ThreadLocalthreadLocal =new ThreadLocal<>();
public static void main(String[] args) {
threadLocal.set("hello");
new Thread(() -> {
threadLocal.set("world");
System.out.println(Thread.currentThread().getName() +"->" +threadLocal.get());
}).start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +"->" +threadLocal.get());
}
}
2)作用:可以理解为线程的上下文,保存线程运行时需要的一些信息,这样每个地方都可以用同一份数据,而且不同线程之间相互不影响 要说明的是 一个线程可以使用多个ThreadLocal(threadLocal1、threadLocal2...)
3)原理:每个线程Thread对象里面有一个成员变量ThreadLocal.ThreadLocalMap threadLocals =null; threadLocals默认为空,ThreadLocalMap中有一个Entry数组(每个Entry是一种key-value结构,key是threadLocal对象,值是threadLocal中保存的值),在set值的时候会保存到Entry数组中对应的位置
FastThreadLocal
1)每个fastThreadLocal都对应一个编号index
2)如果是普通线程,则每个线程对应InternalThreadLocalMap,里面包含一个indexVariables数组,数组小标对应fastThreadLocal的index(数组默认长度是32)和threadLocal一样 每个线程可以对应多个fastThreadLocal 如果是netty自己封装的FastThreadLocalThread,里面包含一个成员变量InternalThreadLocalMap threadLocalMap 直接从成员变量里面取