物理机内存模型与java内存模型

多线程缓存一致性问题

程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中

在单线程的情况下,这没有任何问题,但在多核CPU中(多线程),每条线程可能运行于不同的CPU中,因此每个线程运行时有自己的高速缓存,可能出现如下情况:

执行:i = i + 1;

如果同时有2个线程执行这段代码,初始时i的值为0,两个线程分别读取i的值存入各自所在的CPU的高速缓存当中,

线程1进行加1操作,然后把i的最新值1写入到内存。

此时线程2的高速缓存当中i的值还是0,进行加1操作之后,i的值为1,然后线程2把i的值写入内存。

结果i的值为1。

这就是缓存一致性问题。通常称这种被多个线程访问的变量为共享变量。

解决方案

1)总线加锁

2)缓存一致性协议

-------------------------------------------------------------------------------

物理机内存模型

---------------------------------------------------------------------------------

java内存模型

与物理机内存类似

其中:主存类似于前面说的物理内存,每个线程都有自己的工作内存(类似于前面的高速缓存)。

原文地址:https://www.cnblogs.com/yanze/p/9837109.html