一言以蔽之-Java内存模型(JMM)

141 阅读2分钟

缘起

随着科技的发展,从内存读取数据的速度与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


如果觉得有帮助,就请点个赞鼓励一下吧。

3.png