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冲突问题【环形数组索引】;

浙公网安备 33010602011771号