如果变量被声明为 volatile ,那么对于每次读访问,本地缓存都会从主内存更新,而对于每次写访问,本地缓存都会刷新到主内存。但哪些变量是同步的?我相信,如果我将 v 声明为 volatile ,那么它并不是唯一同步的变量。但线程缓存中的一些其他(或所有)变量也被同步。线程堆栈由多个帧组成,每个帧对应调用的每个方法。它会继续并同步每一帧吗?同步块(synchronized block)是否同步对象中的每个变量?
最佳答案
您需要澄清“缓存刷新”的含义。访问 volatile 变量确实具有变量本身之外的内存效应。事实上, volatile 变量与同步块(synchronized block)具有相同的内存语义。线程在写入 volatile 变量之前所做的一切都会被刷新到“主内存”,以便随后读取该 volatile 变量的任何其他线程都会看到效果。也就是说, volatile 变量的保证的范围是这样的,即唯一的保证与对相同 volatile 变量的访问有关。即,不能保证在写入 volatile 变量后,该线程所做的所有操作都将对所有其他线程可见。
关于java - 当使用synchronized和 volatile 关键字时哪些变量与主内存同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19718070/