Java中的关键字volatile是不是强制单核机器上的内存同步?

Posted

技术标签:

【中文标题】Java中的关键字volatile是不是强制单核机器上的内存同步?【英文标题】:Does the keyword volatile in Java force memory synchronization on single core machine?Java中的关键字volatile是否强制单核机器上的内存同步? 【发布时间】:2013-09-30 16:27:40 【问题描述】:

如果我理解正确的话,volatile 会导致内存屏障使本地内存与主内存同步。这在多核机器上非常有用。

当多线程应用程序在单核机器上运行时会发生这种内存同步吗?

【问题讨论】:

在单 CPU 机器上,没有什么要同步的。在具有超线程的单核机器上,它会强制数据缓存,以便其他线程可以看到它。 【参考方案1】:

当多线程应用程序在单核机器上运行时会发生这种内存同步吗?

是的。 volatile 导致读取和/或写入内存屏障,并确保在另一个线程访问相同的 volatile 字段时“发生在之前”的关系。见this tutorial。它确保对本地 CPU 缓存的更改写入主内存,并且对主内存的更改使任何 CPU 缓存页面无效。

这在单处理器机器上不太重要,因为只需担心一个 CPU 缓存。但是,重要的是要意识到volatile 的“发生前”保证仍然很重要。即使只有一个 CPU,它们也可以防止由于多线程的时间切片而可能发生的竞争条件。

【讨论】:

【参考方案2】:

当多线程应用程序在单核机器上运行时会发生这种内存同步吗?

是的。

【讨论】:

什么意思?没看懂 @gomul - 他的意思是“是”。

以上是关于Java中的关键字volatile是不是强制单核机器上的内存同步?的主要内容,如果未能解决你的问题,请参考以下文章

线程上下文切换是如何完成的?

java基础

多线程--volatile关键字

Java中的volatile关键字

Java中的volatile关键字为什么不是不具有原子性

java并发编程之volatile关键字