缘起
随着科技的发展,从内存读取数据的速度与CPU的处理速度,差距越来越大。
为了解决这个问题,CPU引入了高速缓存,当程序运行时,先将数据从内存中取出放入高速缓存,处理完成后再从高速缓存写入内存。
新的问题
但是在多核多线程的情况下,可能会导致新的问题:
1.缓存不一致:每个CPU的缓存数据可能会不一致。
2.处理器优化:为了提高处理速度,处理器会对代码乱序执行。
3.指令重排:编译器也会对代码乱序处理。
相对应的,在并发编程中,想要保证数据安全,就要满足以下3个特性:
1.原子性:一个操作在CPU中不能被中断执行,要么执行完成,要么不执行。
2.可见性:一个线程修改变量的值,其他线程马上可以看到。
3.有序性:程序的执行顺序按代码的顺序执行。
内存模型
为了保证共享内存的正确性(原子性、可见性、有序性),内存模型定义了共享内存系统中多线程读写行为的操作规范。
主要要两种方式:限制处理器优化、使用内存屏障。
Java内存模型
Java内存模型(Java Memory Model)就是一种符合内存模型规范,屏蔽了底层硬件和操作系统差异的机制和规范。
Java内存模型规定所有的变量都存储在主内存中,每个线程都有自己的工作内存,工作内存中保存了主内存的副本拷贝,线程只能操作自己工作内存中的变量,不能直接操作主内存,各个线程直接也不能互相访问彼此工作内存中的变量,只能在自己的工作内存和主内存直接进行数据同步。
JMM的实现
1.原子性:synchronized
2.可见性:volatile、synchronized
3.有序性:volatile、synchronized
如果觉得有帮助,就请点个赞鼓励一下吧。