百度|Java高级进阶多线程学习之路(七)ThreadLocal


百度|Java高级进阶多线程学习之路(七)ThreadLocal
文章图片
百度|Java高级进阶多线程学习之路(七)ThreadLocal
文章图片
百度|Java高级进阶多线程学习之路(七)ThreadLocal
文章图片
百度|Java高级进阶多线程学习之路(七)ThreadLocal
文章图片
java中有四种引用 , 强软弱虚 , 我写了四个例子我们一个个来看.
强引用:就是普通引用 , new一个对象的时候就是一个强引用 , 当他没有任何引用指向这个对象的时候 , 就会被回收
软引用:WeakReference 主要用于缓存 , 空间不够的时候会被GC.这里设置的20M因为上面用了10M下面再用12M内存不够了 , 所以他回收了软引用的对象 , 当然这里还有一个问题我没有搞清楚 , 就是我下面如果用15M的时候会抛OOM的异常 , 有知道的大佬可以评论告诉我原因吗?【百度|Java高级进阶多线程学习之路(七)ThreadLocal】
弱引用:被GC看到就会回收 , 典型应用ThreadLocal
虚引用:主要管理堆外内存大家知道就行了 , 调用不到数据
下面我们来讲一下ThreadLocal 。 ThreadLocal是线程本地变量 , 他绑定在每个线程上 , 通俗的讲就是每个线程自己独立拥有 , 线程存在 , ThreadLocal就一直存在 。 那么我们来看个例子
如图输出的是空 , 这是因为不同的线程threadLocal调不到另一个线程的数据的 , 那他是怎么来实现的呢 , 我们来看一下源码
我们会发现 , 所谓的ThreadLocal.set() 方法其实并不是往他里面set , 而是set到了一个Thread对象的map里面 , threadlocal当key存储了数据 , 所以这里他能实现不通线程调到的数据是不一样的
大家再来看set方法里有一个entry对象 , 这个对象就相当于map里的一条数据那么我们点进去看一下他发现entry继承了一个弱引用 , 指向了ThreadLocal大家想想为什么这里要使用弱引用?
是因为你不想用这个ThreadLocal对象的话 , 你将它砍掉的时候 , 垃圾回收器会顺利的回收 , 不会存在内存泄露的现象 , 当然这里因为ThreadLocal当key存在map中 , key被回收掉了 , 实际上value还在 , 所以大家一定要记得不使用这个对象的时候要调用remove方法给他删除掉 , 不然也是会造成内存泄露的 。