并发--总结

2019-03-29  本文已影响0人  简书徐小耳

并发--总结

https://my.oschina.net/u/4106059/blog/3029071

MESI和高速缓存

硬件再单核时代为了提高cpu的使用率所以在主内存和cpu之间加入了高速缓存,这样的好处是cpu可以快速对数据进行指令操作。
当多核时代到来由于每个核心都有自己的高速缓存,但是又共享主内存。这就会导致各个处理器之间的缓存数据不一致。为了解决缓存不一致的情况
出现了许多的缓存一致性协议,比较熟悉的就是MESI协议。虽然缓存一致性协议解决了共享变量一致性问题,但是因为其性能较差,所以又引入了写缓冲
和无效队列。这个引入也会导致共享变量一致性问题和伪重排序问题。为了解决一致性和真伪重排序问题,各个硬件又开始支持了内存屏障,虽然实现细节有所不同
但是大致是相似的。

JMM

说回JMM,java为了屏蔽各个硬件和操作系统访问内存的差异(类似于接口,规定了内存模型和访问规则,各个JVM团队在不同的硬件和操作系统上实现即可,细节可以不一样)
整个内存模型借鉴了我们之前说的cpu和主内存之间的操作,java 也规定了自己的主内存(是jvm的主内存,也属于os内存的一部分),同时还有各个工作内存(类似于高速缓存),各个线程类似于处理器。
而java提供的voliatile和synchronized 底层都是依托内存屏障,让指令不会重排序同时又可以让读写操作按照指令顺序正常执行完毕。

JAVA规定了内存间交互操作

内存交互必须满足的规则

HappenBefore

对象头

CAS

流程如下:

As-If-Serial

mfence和sfence

mfence

sfence

lfence

final

上一篇 下一篇

猜你喜欢

热点阅读