此博客是本人从学生时代开始做笔记所用, 部分是工作所遇问题,做填坑笔记,部分闲来查阅资料,加上自己的理解所总结的学习笔记, 常忙得不可开交,若漏了资料来源,望通知~ 前路漫漫,写点东西告诉自己正在一点点进步,而不要迷失于繁忙。

物理机内存模型与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内存模型

与物理机内存类似

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

 

posted @ 2018-12-04 17:59  炎泽  阅读(464)  评论(0编辑  收藏  举报