ThreadLocal其实就是一个并发线程,假如在并发情况下使用同一个静态变量的情况下可以使用threadLocal
threadLocal可以单独为每一个线程创建一个只属于当前线程的变量,这样可以保证并发情况下不会同时操作到该变量,因为每一个线程使用的都是线程内单独的变量,当然,如果是共享变量的话,是不可以这么使用的,该情况只适用于一些数据库连接(template/redis/mongo等)啦,或者是一些不需要共享的变量,或者是一些具有独立属性(比如session)等场景
threadLocal的四种实现
get set remove initialValue
get
取到当前线程,通过当前线程获取一个map, 如果map不为空就通过传进来的key获取这个map中的value,注意,此处如果map中没有这个key的话,会报空指针!! 我们看源码有一个setInitialValue方法,点进去会看到一个initialValue方法
可以看到initialValue返回的是一个空
进行创建new ThreadLocalMap的时候, 就会报空指针异常,所以在进行get操作的时候,要先进行set,当然,也可以不进行set,这个时候就需要重写initialValue方法来写入一个value值进去, 这样在get方法中的initialValue时就会返回提前重写进去的值
set
set方法和get异曲同工,不同的是在map是空的情况下,value值是传递进去的
remove
如果map不为空,就remove
initialValue
和get中的initialValue相同