2

如果一个变量被声明为易失性,那么对于每次读取访问,本地缓存都会从主内存更新,并且对于每次写入访问,本地缓存都会刷新到主内存。但是哪些变量是同步的?我相信,如果我将 v 声明为 volatile,那不是唯一同步的变量。但是线程缓存中的一些其他(或所有)变量也被同步。线程堆栈由多个帧组成,每个帧对应于调用的每个方法。它会继续并同步每一帧吗?同步块是否同步对象中的每个变量?

4

2 回答 2

2

您需要澄清您的意思是“缓存刷新”。访问 volatile 变量确实会在变量本身之外产生记忆效应。事实上,易失性变量与同步块具有相同的内存语义。线程在写入 volatile 变量之前所做的一切都被刷新到“主内存”,这样任何其他线程随后读取该 volatile 变量都会看到效果。也就是说,对 volatile 变量的保证是限定范围的,因此唯一的保证与对同一volatile 变量的访问有关。也就是说,不能保证在写入 volatile 变量后,该线程所做的一切将对所有其他线程可见。

于 2013-10-31T23:56:13.470 回答
0

当您读取一个volatile变量时,JVM 的所有承诺是该变量包含任何线程写入它的最新值。

在幕后,系统可能会在读取发生之前将所有线程的缓存完全刷新到 RAM,但这没有指定,因此可能会发生也可能不会发生。

因此,总而言之,它可能是每一帧,但它将包括访问的变量。

访问 Brian Goetz 的优秀Java 理论和实践:管理波动性。您会发现以下评论:

...线程将自动查看 volatile 变量的最新值。

这真的总结了它,这里重要的一点是volatile变量仅此而已。它们不是缓存刷新机制,尽管它们使用缓存刷新来实现其目标。

于 2013-10-31T23:08:54.170 回答