物理机内存模型与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内存模型
与物理机内存类似
其中:主存类似于前面说的物理内存,每个线程都有自己的工作内存(类似于前面的高速缓存)。