jdk内存模型

#8个原子操作
针对jvm主内存与工作内存的数据操作

1
2
3
4
5
6
7
8
lock----锁定
unlock----释放锁
read----读
write----写
load----加载
assign----赋值
use----使用
store----写入主内存

特例:
long、double、64为内存、在32为虚拟机中分两次操作、
load、store、read、write都不是源自操作

#8个规则:

1
2
3
4
5
6
7
8
9
1、不允许read、load、store、write单独出现
2、不允许thread丢弃assign
3、不允许任何一线程、没有assign的数据 从工作内存store到主内存
4、一个新变量只能在主内存“诞生”、对一个变量“use/store”之前、执行assign、load操作
5、一个变量在同一时刻只允许一个线程对其进行lock、但lock可以被执行多次、lock标记为累加、多次lock需要多次unlock

6、对一个变量执行lock、会清空工作内存中变量值、使用之前需要重新load、assign
7、如果未lock、不能unlock
8、执行unlock之前、限制性工作内存同步主内存

都挺好理解、计算机这个东西、没啥难度、
lock是做标记为int ++ –做锁标记位

#内存可见性

1、volatile
2、sychronized
3、final

#有序性
1、线程内表现为串行

#无序
1、指令重排序【使用volatile可以阻止指令重排序】
2、sychronized 同一个变量、在同一时刻、允许同一线程串行进入

3、编译器静态优化会打乱代码执行顺序
4、jvm动态优化会打乱代码执行顺序
5、硬件可以打乱执行顺序以优化其性能

#线程安全
1、不可变—final
2、绝对安全
3、相对安全
4、线程兼容
5、独立—对程序有害

#线程发展史

1、重量级、执行标记位 加sychronized的地方、我在内存中加一个标记为、标记该方法、该对象、我正在使用、你不能使用
2、偏向锁、object标记、Mark Word中偏向锁的标识
3、轻量级、reentranlock、线程中自建一个object标记、增加了trylock(times)、可队列执行锁方法、规则名aqs、
4、算法代替锁、设计思想是、假设没有竞争、竞争时候通过算法判断、cas、拿旧值和内存原值比较、一致则修改为新值