ThreadLocal是什么?
一种线程隔离机制,保证了多线程环境下访问共享变量的安全性。在多线程访问共享变量的这个场景下,我之前学到的是通过对共享变量加锁来实现在同一时刻只有一个线程可以更新共享变量,其他线程也可以立刻看到(happens-before规则里面的一个锁监听器)。
那这个threadlocal又是怎么实现的呢?
threadlocal在每一个线程里面都提供了一个容器,然后拷贝一个共享变量的副本,放到这个容器里面,每个线程就可以独立地操作更新自己的变量副本,从而影响不到其他地线程。但它并不是多线程同步机制的一种,只是一个在多线程环境下,为变量安全提供的一种解决思路。
threadlocal里面有一个内部类threadlocalmap,这个类才是真正实现线程隔离机制地关键,threadlocalmap内部类似于map,是由键值对组成地entry数组,key是threadlocal本身地弱引用,value就是对应的线程变量副本。
1、threadloacl本身并不存储值,只提供key
2、threadlocal包含在thread中,是thread的一个局部变量
ThreadLocal的方法
- get 用来获取ThreadLocal在当前线程中保存的变量副本
- set 用来设置当前线程中变量的副本
- remove 用来移除当前线程中变量的副本
- initialValue 是一个protected方法,一般是用来在使用时进行重写的
疑问
操作的副本,别的线程怎么看见更新后的变量值?
我寻思,像银行取钱这种需要同步的,不用ThreadLocal不就完了?不行吗?