ThreadLocal

ThreadLocal

  • 提供线程内部的局部变量,在多线程下保证各个变量的相对独立性;

    【与当前线程绑定的局部变量】

  • 线程隔离:将共享变量加载为线程局部变量

    ThreadLocal();
    void set(T value);
    T get();
    void remove();
    
  • 与symchronized的区别是,能够多线程并发执行,

    • 空间换时间【高效】,时间换空间;
  • ThreadLocal的内部结构:

    • 早期:在ThreadLocal维护一个map,以线程id作为key,局部变量的值作为value【有多少个线程,就有多少个map】;
    • 现在:在线程内部维护一个ThreadLocalMap,以ThreadLocal对象作为key,局部的值作为value【线程消亡,ThreadLocalMap会自动销毁】;
    • ThreadLocalMap是ThreadLocal的内部类,没有是由map接口;
      • ThreadLocal的对象采用弱引用,将变量周期和线程周期解绑:
      • 当ThreadLocal引用变量被回收后,当前线程仍然会维护ThreadLocalMap,所以对应ThreadLocal就不会被回收,key-value仍存在,旧会造成内存泄露;
      • 但使用弱引用后,ThreadLocal引用变量被回收,那么对于ThreadLocal就只有一个弱引用,因此会被回收,置为null;
      • 当调用ThreadLocalMap中的set和getEntry方法中,会对key进行判断,如果为null,那么对应value也会置为null,从而避免了内存泄漏;
    • Thr eadLocalMap中的hash冲突:
      • 扰动函数:使用魔数:1,640,531,527 * ( i + 1), 可以使得数据尽可能完美散列在容器中;
      • 32位有符号位的黄金分割值是:1,640,531,527【0.618】;
      • 使用线程探测法解决hash冲突问题【环形数组索引】;
posted @ 2025-03-30 23:37  烟雨断桥  阅读(11)  评论(0)    收藏  举报