1.ThreadLocal简介
“水能载舟,亦能覆舟”,形容ThreadLocal最为贴切,因为它的初衷是在线程并发时,解决变量共享的问题,但是由于过度设计,比如弱引用、哈希碰撞,导致理解难度大,使用成本高,反而成为故障高发点,容易出现内存泄漏,脏数据、共享对象更新等问题。也许你认为它包治共享变量的问题,然而并不是。下面从内存模型,弱引用,哈希算法角度分析:
2.ThreadLocal 应用场景
讨论ThreadLocal用在什么地方前,我们先明确下,如果仅仅就一个线程,那么都不用谈ThreadLocal的,ThreadLocal是用在多线程的场景的!!!
ThreadLocal归纳下来就2类用途:
-
保存线程上下文信息,在任意需要的地方可以获取
-
线程安全的,避免某些情况需要考虑线程安全必须同步带来的性能损失!
一、引用类型介绍
对象在堆上创建之后所持有的引用其实是一种变量类型,引用之间通过赋值可以构成引用链。从GC Root开始遍历,判断引用是否可达,引用的可达性是判断能否被垃圾回收的基本条件。根据引用类型语义的强弱可以决定垃圾回收的阶段。
- 强引用(Strong Reference): Object object=new Object();这样的变量声明和定义就会产生对该对象的强引用。只要对象有强引用指向,并且GC Root可达,那么Java内存回收时,即使内存濒临耗尽,也不会回收该对象。
- 软引用(Soft Reference): 引用力弱与强引用,用在非必须对象的场景。在即将OOM之前,垃圾回收器会把这些引用指向的对象加入回收范围,以获