美文网首页
69.ThradLocal原理

69.ThradLocal原理

作者: SlideException | 来源:发表于2020-08-05 22:13 被阅读0次

/**
* 每天一个知识点day69 TODO ThreadLocal原理
*
* https://www.cnblogs.com/fengzheng/p/8690253.html
* https://www.cnblogs.com/luxiaoxun/p/8744826.html
*
* ThreadLocal是线程的局部变量,这些变量只能在线程内部被读写,在其他
* 线程内是无法访问的,ThreadLocal定义的通常是与线程相关的私有静态字段。
*
* 变量有全局和局部变量,涉及到全局变量自然会出现多线程安全问题,要保证
* 多线程安全访问,就涉及到线程的同步了,ThreadLocal相当于提供了介于
* 局部变量与全局变量中间的这样一种线程内部的全局变量。
*
* 只想在本线程内部使用的变量 可以用ThreadLocal来实现,并且这些变量和线程
* 的生命周期是密切相关的,线程结束,变量也就销毁了。
*
* 每个Thread内有自己的实例副本,且该副本只能由当前Thread使用。
* 这是也是 ThreadLocal 命名的由来。
* 既然每个Thread有自己的实例副本,且其它Thread不可访问,
* 那就不存在多线程间共享的问题。
*
* ThreadLocal 提供了线程本地的实例。它与普通变量的区别在于,
* 每个使用该变量的线程都会初始化一个完全独立的实例副本。
* ThreadLocal 变量通常被private static修饰。
* 当一个线程结束时,它所使用的所有 ThreadLocal 相对的实例副本都可被回收。
*
* ThreadLocal使用方式:
* 核心的操作就四个:创建,创建并赋初始值,赋值,取值。
*
* 原理:
* ThreadLocal是一个泛型类,保证可以接受任何类型的对象,
* ThreadLocal内部维护了一个Map,这个Map不是HashMap,而是ThreadLocal里
* 的一个静态内部类ThreadLocalMap,使用的get set方法实际是
* 调用了ThreadLocalMap里的get set方法,
*
* set()
* public void set(T value) {
* Thread t = Thread.currentThread();
* ThreadLocalMap map = getMap(t);
* if (map != null)
* map.set(this, value);
* else
* createMap(t, value);
* }
* 调用set首先获取当前线程,然后获取当前线程维护的ThreadLocal对象,
* 最后在ThreadLocalMap实例中添加,如果ThreadLocalMap不存在,则初始化
* 并赋初始值。
* set方法第一个参数是this,即指当前的ThreadLocal对象。
* 最终的变量是放在了当前线程的 ThreadLocalMap中,
* 并不是存在 ThreadLocal上,ThreadLocal可以理解为只是一个中间工具,传递了变量值。
*
* 内存泄漏问题
* 实际上 ThreadLocalMap 中使用的 key 为 ThreadLocal 的弱引用,
* 弱引用的特点是,如果这个对象只存在弱引用,那么在下一次垃圾回收的时候必然会被清理掉。
* 所以如果 ThreadLocal 没有被外部强引用的情况下,在垃圾回收的时候会被清理掉的,
* 这样一来 ThreadLocalMap 中使用这个 ThreadLocal 的 key 也会被清理掉。
* 但是,value 是强引用,不会被清理,这样一来就会出现 key 为 null 的 value。
* ThreadLocalMap 实现中已经考虑了这种情况,在调用 set()、get()、remove() 方法的时候,
* 会清理掉 key 为 null 的记录。如果说会出现内存泄漏,
* 那只有在出现了 key 为 null 的记录后,没有手动调用 remove() 方法,
* 并且之后也不再调用 get()、set()、remove() 方法的情况下。
*
* 使用 ThreadLocal 的时候,最好要声明为静态的。
* 使用完 ThreadLocal ,最好手动调用 remove() 方法。
*
* 使用:
* 比如Java7中的SimpleDateFormat不是线程安全的,可以用ThreadLocal来解决这个问题:
* public class DateUtil {
* private static ThreadLocal<SimpleDateFormat> format1 =
* new ThreadLocal<SimpleDateFormat>() {
* @Override
* protected SimpleDateFormat initialValue() {
* return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
* }
* };
*
* public static String formatDate(Date date) {
* return format1.get().format(date);
* }
* }
*
*/

相关文章

  • 69.ThradLocal原理

    /*** 每天一个知识点day69 TODO ThreadLocal原理** https://www.cnblog...

  • 华与华方法(8)传播第一原理

    传播三大原理: 第一原理:刺激反射原理 第二原理:播传原理 第三原理:信号能量原理。 一、刺激反射原理 所有传播都...

  • 大数据相关

    hadoop原理 spark原理 kafka原理 数据仓库部分 Hadoop原理 MapReduce的原理默认根据...

  • js call apply instanceof 实现原理

    call原理 apply原理 instanceof原理

  • 《影响力》读后感

    全书主要围绕六大原理开展,分别是互惠原理,承诺和一致原理,社会认同原理,喜好原理,权威原理,以及稀缺原理。全文结构...

  • Today面试

    Runloop 底层原理Kvo 底层原理ARC 底层原理 如何实现GCD 底层原理Block 底层原理Aut...

  • iOS底层原理:weak的实现原理

    iOS底层原理:weak的实现原理iOS底层原理:weak的实现原理

  • 原理原理原理

    忙碌的一天,英语还有一个小题,明天完善,明天加油背诵英语对话 ,今天个人简历也有了大体框架,明天完善一下,加油。 ...

  • uv平板打印机三种原理

    uv平板打印机原理主要包括三个方面原理,分别是打印原理、色彩原理、成像原理。其中打印原理影响了其印刷范围,...

  • stream系列——初始stream方法

    map原理 filter原理 flatMap原理 reduce操作累加

网友评论

      本文标题:69.ThradLocal原理

      本文链接:https://www.haomeiwen.com/subject/myharktx.html