多线程之总线风暴

Posted strandtrack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程之总线风暴相关的知识,希望对你有一定的参考价值。

先来点真实的,volatile和cas会导致总线风暴。

说到总线风暴,先讲一下volatile,cas就不说了吧,Compare And Swap很好理解吧,题外话(会导致ABA问题)

Volatile:

讲到volatile先讲一下内存模型,众所周知,cpu和内存之间的运算效率差了许多数量级,

为了保证效率,中间会有好多LLV那种缓存,我们线程在缓存中工作,

在工作时,会将数据从主内存中加载到工作内存中,这个时候就会出现一个问题,多个线程之间的可见性(内存屏障)。在jvm层面为了解决问题,抽象出来了jmm这种模型。用volatile之后就会保证可见性,它会立刻刷到主内存,并且他在使用时会从主内存中取出值并刷新。volatile用的机制就是总线嗅探机制,就是不断刷新到主内存。(题外话:volatile不能保证原子性,这个是讲到volatile必须要提到的一个点,那么如何保证原子性呢,这个时候可以用加锁,synchroniezd或者原子类,Atomic的那些类,比如AtomicInteger等等。然后volatile还能保证不被指令重排)

总线嗅探机制:

每个处理器会通过嗅探器来监控总线上的数据来检查自己缓存内的数据是否过期,如果发现自己缓存行对应的地址被修改了,就会将此缓存行置为无效。当处理器对此数据进行操作时,就会重新从主内存中读取数据到缓存行。

总线嗅探机制就会导致总线风暴的问题:

在多核处理器架构上,所有的处理器是共用一条总线的,都是靠此总线来和主内存进行数据交互。当主内存的数据同时存在于多个处理的高速缓存中时,某一处理器更新了此共享数据后。会通过总线触发嗅探机制来通知其他处理器将自己高速缓存内的共享数据置为无效,在下次使用时重新从主内存加载最新数据。而这种通过总线来进行通信则称之为”缓存一致性流量“。

因为总线是固定的,所有相应可以接受的通信能力也就是固定的了,如果缓存一致性流量突然激增,必然会使总线的处理能力受到影响。而恰好CAS和volatile 会导致缓存一致性流量增大。如果很多线程都共享一个变量,当共享变量进行CAS等数据变更时,就有可能产生总线风暴。

以上是关于多线程之总线风暴的主要内容,如果未能解决你的问题,请参考以下文章

多线程之总线风暴

多线程之总线风暴

java多线程进阶可见性

并发编程之多线程

volatile,从JVM的层面解释并发

volatile,从JVM的层面解释并发