java内存模型 volatile threadLocal

内存模型

共享变量式内存模型
线程的同步和通信

计算机结构

cpu内,有多核,每个核有单独的寄存器,一级缓存,二级缓存
cpu处理器外,跟主存(RAM)去通信。

java的内存分配

虚拟机栈

本地方法栈
程序记数器
方法区

其中栈和堆都是在主存上分配的一块区域。
其中栈空间比较小,存放:
1.八种基本类型和对象的引用
2.方法的出入栈信息
3.操作指令
是一块连续的区域

java内存模型的实现原理

主要就是两个问题:

  1. 线程间的通信
  2. 线程间的同步互斥

其中,同步互斥依赖的是Synchronized关键字和ReentLock工具类
而volitile关键字,保证线程对共享变量的可见行,实现的通信。

volitile关键字的原理,是内存屏障
保证了变量的可见行和防止编译器对字节码重排序

不同的线程会有本地变量(对应的计算机物理结构,就是线程处在不同的cpu核心下)。这个本地变量是RAM主存下的副本。所以有可能值会不同。
本volitile关键字修饰的变量,在jvm编译成字节码时,会在这个变量前,生成对应的操作系统内存屏障指令集。
具体:

  1. 写操作,会强制把线程本地变量刷新到主内存
  2. 读操作,会强制把主内存的数据刷新到线程本地变量副本里
threadLocal 线程本地变量

volatile保证线程间对变量的可见性,而threadLocal确实保证,变量在每个线程里都是独立的副本,相互之前不受影响。原理数据结构

  1. 每个线程Thread内都有一个threadLocalMap的变量。
  2. threadLocalMap是threadLocal里的静态内部类。这个map存放的key是threadLocal,value是对应的变量值object类型
  3. 线程获取线程独立变量值的过程,Thread.currentThread获取当前线程,从该线程里threadLocalMap变量里获取key为threadLocal的value值。

你可能感兴趣的:(java内存模型 volatile threadLocal)