学习
多线程
volatile,ThreadLocal的使用场景和原理
-
volatile原理
volatile变量进行写操作时,JVM 会向处理器发送一条 Lock 前缀的指令,将这个变量所在缓存行的数据写会到系统内存。Lock 前缀指令实际上相当于一个内存屏障(也成内存栅栏),它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成。
volatile的适用场景
- 态标志,如:初始化或请求停机
- 一次性安全发布,如:单列模式
- 独立观察,如:定期更新某个值
- “volatile bean” 模式
- 开销较低的“读-写锁”策略,如:计数器
-
ThreadLocal原理
ThreadLocal是用来维护本线程的变量的,并不能解决共享变量的并发问题 。ThreadLocal是 各线程将值存入该线程的map中,以ThreadLocal自身作为key,需要用时获得的是该线程之前 存入的值。如果存入的是共享变量,那取出的也是共享变量,并发问题还是存在的。
ThreadLocal的适用场景: 数据库连接、Session管理