csworkman

个人博客

ThreadLocal——总结

2022-6-13 Mr Chang JUC

最佳实践:
  1. ThreadLocal.withInitial(() -> 初始化值);
  2. 建议把ThreadLocal 修饰为static。
    说明:这个变量是针对一个线程内所有操作共享的,所以设置为静态变量,所有此类实例共享此静态变量,也就是在类第一次呗使用时装载,只分配一块存储空间,所有此类的对象(只要是这个线程内定义的)都可以操控这个变量。
  3. 用完记得手动remove


总结:
  • ThreadLocal 并不解决线程间共享数据的问题
  • ThreadLocal适用于变量在线程间隔离并且在方法间共享的场景
  • ThreadLocal通过隐式的在不同线程内创建独立实例副本避免了实例线程安全的问题,每个线程持有一个只属于自己的专属Map并维护了ThreadLocal对象与具体实例的映射,该Map由于只被持有它的线程访问,故不存在线程安全以及锁的问题。
  • ThreadLocalMap的Entry对ThreadLocal的引用为弱引用,避免了ThreadLocal对象无法被回收的问题都会通过expungeStateEntry,cleanSomeSlots,replaceStaleEntry这三个方法回收键为null的Entry对象的值以及Entry对象本身从而防止内存泄漏。属于安全加固的方法,群雄逐鹿起纷争,人各一份天下安。




发表评论: