学校网站建设流程,凡科做的网站被举报了会怎么样,网站建设刂金手指下拉十五,合肥seo网站建设费用一、ThreadLocal 引用关系 图解关系说明#xff1a;
每个线程拥有自己的 ThreadLocalMap 属性#xff1b;ThreadLocalMap 的存储结构为 Entry[] 数组#xff1b;Entry的Key是ThreadLocal类型且弱引用指向ThreadLocal对象#xff0c;Value是我们自己定义的泛型值对象#…一、ThreadLocal 引用关系 图解关系说明
每个线程拥有自己的 ThreadLocalMap 属性ThreadLocalMap 的存储结构为 Entry[] 数组Entry的Key是ThreadLocal类型且弱引用指向ThreadLocal对象Value是我们自己定义的泛型值对象ThreadLocal的生命周期是GCThreadLocalMap的生命周期是和Thread同步
解析当线程使用Threadlocal 时是将Threadlocal 当做自己线程属性ThreadLocalMap中一个Entry的key值实际上存放的变量是Entry的value值实际要使用的值是value值。
value值为什么不存在并发问题呢因为它只有一个线程能访问。threadlocal可以当做一个索引可以有多个threadlocal 变量不同的threadlocal对应于不同的value值他们之间互不影响。ThreadLocal为每一个线程都提供了变量的副本使得每个线程在某一时间访问到的并不是同一个对象这样就隔离了多个线程对数据的数据共享。 强引用GC不会被清理掉 软引用SoftReference内存不足时会背垃圾回收器回收 弱引用WeakReference 当jvm进行垃圾回收就回收 虚引用没有引用 二、ThreadLocal 使用方法解析 // TODO对应源码及注释后期补上 get——获取threadlocal局部变量set——设置threadlocal局部变量initialvalue——设置局部变量的初始值remove——删除该局部变量
三、ThreadLocal 常见面试解答
1. ThreadLocal和普通线程中的变量的区别
普通变量在多线程环境下是线程共享的会有并发问题ThreadLocal在多线程环境下为线程私有变量值对其他线程不可见不会有多线程访问不安全的情况。
2. key为什么设置为弱引用
强引用也无能为力业务使用完ThreadLocal的时候ThreadLocalRef被回收了但是还是存在key的强引用导致Entry对象还是无法被回收弱引用的好处当前线程仍然运行的情况下就算忘记调用Remove()方法在下次使用ThreadLocal的时候会对 key为null的Value进行清除操作比强引用多了一层保障。
3. 为什么不使用当前线程作为当前的key 直接用当前线程来作为ThreadLocalMap的key无法区分放入ThreadLocalMap中的多个value。 比如放入了两个字符串无法判断取出来的是哪一个字符串 使用ThreadLocal作为key就不一样了每一个ThreadLocal对象都可以由ThreadLocalHashCode属性唯一区分或者说每一个ThreadLocal对象都可以由这个对象的名字唯一区分所以可以用不同的ThreadLocal作为key区分不同的value方便存取。
4. 如何避免内存泄漏
将ThreadLocal定义为 private static 使生命周期更长保证ThreadLocal的强引用一直存在而不会回收保证在ThreadLocal的弱引用能够找到Entry的值并remove掉ps这段是其他文章中抄的我认为应该理解成下次操作ThreadLocalMap的时候 JDK可以通过remove掉key为null的 Entry。[这个欢迎有大佬指正]每次使用完ThreadLocal的时候都调用remove()方法。
5. ThreadLocal有哪些使用场景 ThreadLocal使用于以下两种场景 每个线程需要有自己单独的实例实例需要在多个方法中共享但不希望其他线程共享 JavaWeb中使用ThreadLocal传递Session信息数据库连接处理数据库事务日志、调用链路追踪