多核与单处理器中的易失性关键字?

时间:2014-05-11 13:14:04

标签: java multithreading concurrency volatile

我听过很多人说volatile变量关键字在多核处理器中更有意义 比单核处理器但不知道原因。我试图谷歌但没有帮助 这方面。有什么理由吗?

根据我的理解,无论是多核还是单处理器,volatile关键字应该具有同等重要性。 原因是volatile,它保证值将在主内存(堆)中更新而不是保持 它在线程本地内存(堆栈)中,可以被所有线程看到。无论是多核还是单处理器, 它是如何产生差异的?

4 个答案:

答案 0 :(得分:6)

“易变性”与核心数量无关。 JVM隐藏了底层架构。更不用说volatile是一个语言关键字,因此它在每个架构上都应该表现相同。

你描述了volatile的作用,它是正确的。 应用程序的体系结构,可能需要使用volatile,没有别的。

如果您有兴趣,这里有一篇关于volatile的好文章,以及Java中使用的内存模型的基本概念。

http://jeremymanson.blogspot.hu/2008/11/what-volatile-means-in-java.html

答案 1 :(得分:2)

首先," volatile"尝试减少可能在不同线程上发生的可见性问题(想想每个线程范围中的共享变量的局部变量/副本)。但是,当您有多个CPU核心(缓存,寄存器)时,并行化的级别更容易可视化。 IMO,这就是为什么它在多核架构中更有意义的原因。然而,当您拥有单核,多个线程时,可能会出现这种可见性问题,并且其中两个线程碰巧在另一个更新之前一个接一个地读取相同的变量值。在任何一种情况下,无论是单核还是多核架构,volatile都会以相同的方式工作。

关键是要理解CPU缓存上的易失性变量,否则寄存器将使用IMMEDIATE写策略写回主存储器,因此任何后续读取同一变量将读取最新更新的值。

Volatile只会增加同步线程的机会 - 但它的保证。如果你有多个线程更新共享数据,那么volatile可能就不够了。您可以利用易变的概念利用其他功能。请看一下here

答案 2 :(得分:-2)

根据我的理解,volatile与单核心无关。从主存储器推送/读取易失性变量更新,这在多核架构中很重要,其中每个核心可以具有其自己的高速缓存,因此对于在不同核心上运行的其他线程,特定核心的高速缓存中的更新可能是不可见的。

但是如果你有一个核心,那么当你更新一个非易失性的变量时,如果它在核心的缓存中得到更新而没有被推送到主内存,这可能没问题,因为所有其他线程都运行在同一个核心上因此,它将看到它们共享的缓存中可用的最新值。所以你不需要那里的波动。

答案 3 :(得分:-3)

您的理解是正确的。 {<1}}关键字在单线程应用程序中没有任何意义,无论它在单核或多核CPU上运行,因为volatile变量保证对线程可见的更改。如果不这样做,即使在单核环境中,您很可能也会遇到可见性问题。如果多线程应用程序在sngle或多核环境中运行,则有时需要volatile个变量(或其他方式或同步/可见性保证)。