ThreadLocal
线程本地变量
set 设置到当前线程内的map中
所以不能被线程共享
ThreadLocal应用 spring 声明式事务
threadlocal可以保证 一个线程保存同一个对象 所以数据库连接就可以存在ThreadLocal内一个事务必须在一个连接内,spring 声明事务就是使用threadLocal来设计的,保证了在多线程环境下connection线程安全。
强引用
M m = new M(); //强引用不能被回收 //m = null; //清空引用才能被回收
软引用
SoftReference<byte[]> m = new SoftReference<>(new byte[1024*1024*10]);
软引用 空间不够才回收 非常时候做缓存
弱引用
WeakReference<M> m = new WeakReference<>(new M()); //弱引用 一般用于容器
ThreadLocal<M> tl = new ThreadLocal<>(); tl.set(new M()); tl.remove(); //坑点 key是弱引用 但是value不是 所以需要手动remove
为什么ThreadLocal 要使用弱引用?
因为threadLocal是线程本地对象会跟随着线程一直存活 如果采用强引用 内存一直都不会被回收 就会产生内存泄漏
虚引用
private static final ReferenceQueue<M> QUEUE = new ReferenceQueue<>();
PhantomReference<M> phantomReference = new PhantomReference<>(new M(), QUEUE);
//在虚引用被回收时会 放到queue一个通知