java线程内存模型的8种操作:
read(读取):从主存中读取数据
load(加载):将从主存中读取的数据加载到内存工作
use(使用):使用工作内存中的数
assign(赋值):如果某个线程对共享变量做出了改变,将数据从新写入工作区
store():将改变后的工作区的数据重新写回主内存中
write(写):给主内存中的变量重新赋新值。
lock(加锁):
unlock(解锁):
解决jvm缓存不一致的问题:
总线加锁:性能低,因为通过总线加锁机制,最终会把多核cpu并行执行弄成串行执行,由于lock和unlock
MESI缓存一致协议:多个cpu从主存读取回一个数据到各自的高速缓存中,当某个线程对数据做出改变时,立马同步会主内存,其他cpu通过总线嗅探机制可以感知到数据的变化从而将自己缓存里的数据失效,MESI缓存一致协议只会在回写到主存的时候加lock锁,粒度非常小。
由于在线程中使用变量时,每个线程各自都会有变量的副本,所以,当一个线程中的数据改变之后,另一个线程不知道数据变换了,而Volatile可以解决数据的可见性
并发三大特性:可见性,原子性,有序性
Volatile:底层是通过汇编语言的前缀指令lock实现的,解决了多线程之间共享变量的可见性,単并不保证原子性,volatile会降低程序的执行效率,不能代替Synchronized