java - 当使用synchronized和 volatile 关键字时哪些变量与主内存同步

标签 java multithreading synchronization volatile

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

最佳答案

您需要澄清“缓存刷新”的含义。访问 volatile 变量确实具有变量本身之外的内存效应。事实上, volatile 变量与同步块(synchronized block)具有相同的内存语义。线程在写入 volatile 变量之前所做的一切都会被刷新到“主内存”,以便随后读取该 volatile 变量的任何其他线程都会看到效果。也就是说, volatile 变量的保证的范围是这样的,即唯一的保证与对相同 volatile 变量的访问有关。即,不能保证在写入 volatile 变量后,该线程所做的所有操作都将对所有其他线程可见。

关于java - 当使用synchronized和 volatile 关键字时哪些变量与主内存同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19718070/

相关文章:

c# - 在主线程中创建对象并在另一个线程中使用它们。怎么做?

java - 同步关键字内部实现

javascript - 同步window.setTimeout回调

java - IntelliJ IDEA - 如何将 .java 文件复制为资源?

java - Tomcat 用户具有主要角色,但 request.isUserInRole() 另有说明

java - Maven 插件执行 ID

java - 按照线程启动的顺序获取线程的结果

java - 存储大量小文件 : archive vs. 文件系统

python - 如何允许长时间运行的 python 函数在其父函数终止后继续执行?

java - 为什么在 boolean 值上同步不是一个好的做法?