一、JAVA的并发模型
共享内存模型
在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存中公共状态来进行隐式通信
该内存指的是主内存,实际上是物理内存的一小部分
二、JAVA 内存模型的抽象
1、java内存中哪些数据是线程安全的,哪些是非安全的
非线程安全:
在java中所有的实例域、静态域、和数组元素都存放在堆内存中,并且这些数据是线程共享的,所以会存在内存可见性问题
线程安全
局部变量、方法定义的参数、异常处理器参数是当前线程的虚拟机栈中的数据,并且不会进行线程共享,所以不会存在内存可见性问题
2、线程间通讯的本质
线程间通讯的本质是
JMM即JAVA内存模型进行控制,JMM决定了一个线程对共享变量的写入何时对其他线程可见。
由上图能看出来线程间的通讯都是通过主内存来进行传递消息的, 每个线程在进行共享数据处理的时候都是将共享的数据复制到当前线程本地(每个线程自己都有一个内存)来进行操作。
消息通讯过程(不考虑数据安全性的问题)
线程一将主内存中的共享变量 A 加载到自己的本地内存中进行处理。比如 A = 1;
此时将修改的共享变量 A 刷入到主内存中, 之后线程二再将主内存中的共享变量 A 读取到本地内存进行操作;
整个数据交互的过程是JMM控制的,主要控制主内存与每个线程的本地内存如何进行交互来提供共享数据的可见性
三、重排序
程序在执行的时候为了提高效率会将程序指令进行重新排序
1、重排序分类
编译器优化重排序
编译器在不改变单线程程序语义的情况下进行语句执行顺序的优化
指令集并行重排序
如果不存在数据的依赖性的话,处理器可以改变语句对应机器指令的执行顺序
内存系统重排序
由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行