多线程——并发三特性
多线程并发三特性:原子性、可见性和有序性。
1. 可见性
1.1 JMM
JMM(Java Memory Model) Java内存模型,是java虚拟机规范中所定义的一种内存模型。
Java内存模型(Java Memory Model)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取变量这样的底层细节。
所有的共享变量都存储于主内存。这里所说的变量指的是实例变量和类变量。不包含局部变量,因为局部变量是线程私有的,因此不存在竞争问题。
每一个线程还存在自己的工作内存,线程的工作内存,保留了被线程使用的变量的工作副本。线程对变量的所有的操作(读,取)都必须在工作内存中完成,而不能直接读写主内存中的变量,不同线程之间也不能直接访问对方工作内存中的变量,线程间变量的值的传递需要通过主内存完成。
1.2 问题处理
不可见性原因:
每个线程都有自己的工作内存,线程都是从主内存拷贝共享变量的副本值。
每个线程都是在自己的工作内存中操作共享变量的。
方式一:加锁 synchronized代码块
while(true) {synchronized (volatileThread) {if(volatileThread.isFlag()) {System.out.println("执行了-----");}}
} 
工作原理:
当获得对象锁,线程进入同步代码块之后,清空当前线程中的共享变量,当使用时去主内存中读取最新的共享变量的副本。
某一个线程进入synchronized代码块前后,执行过程入:
- 线程获得锁
 - 清空工作内存
 - 从主内存拷贝共享变量最新的值到工作内存成为副本
 - 执行代码
 - 将修改后的副本的值刷新回主内存中<
 
