多线程缓存一致性问题

程序在运行过程中,会将运算需要的数据从主存复制一份到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内存模型

 

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

 

java内存模型

与物理机内存类似

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

 

相关文章:

  • 2022-12-23
  • 2021-11-06
  • 2021-05-24
  • 2021-09-08
  • 2021-06-05
  • 2021-07-29
猜你喜欢
  • 2021-05-19
  • 2022-12-23
  • 2021-06-12
  • 2021-09-05
  • 2021-10-29
  • 2021-10-11
  • 2021-09-28
相关资源
相似解决方案