java - 创建一个新线程是否有刷新缓存的副作用?

标签 java multithreading concurrency thread-safety

我想知道在 Java 中创建新线程是否会触发缓存刷新。假设我按以下顺序做这样的事情:

  1. 线程运行并设置变量 X。
  2. 线程创建一个新线程。
  3. 新线程访问X。

我的问题是:新线程是否在创建时或开始执行时保证看到旧线程在步骤 1 中对 X 所做的更新?我明白,如果旧线程将来更改了 X 的值,则不能保证新线程会看到这些更改。没关系。我只想知道新线程在启动时是否会看到正确的值而不需要显式同步。

当我最初决定研究这个主题时,我以为简单的谷歌搜索会立即揭示答案,但出于某种原因,我找不到任何解决这个问题的结果。

最佳答案

是的,是的。

在 Java 中,有一种“先于发生”的关系,它指定了两个 Action 之间可见的内存效应。如果“A happens-before B”,那么 Action B 一定会看到 Action A 所做的所有更改。

启动线程会在“thread.start()”调用和在新线程上执行的所有代码之间创建“先发生”关系。因此保证新线程在第一个线程上看到更改变量 X 的内存效应。

要快速了解 happens-before 关系,请参阅 Memory Visibility java.util.concurrent 包概述的一部分。在您的情况下,有趣的部分是:

  • 线程中的每个操作都先于该线程中按程序顺序出现的每个操作之前发生。
  • 启动线程的调用发生在启动线程中的任何操作之前。

更多链接如果你好奇:

关于java - 创建一个新线程是否有刷新缓存的副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8510631/

相关文章:

java - 避免同时执行两次 Spring @Async 任务

java - Hibernate 中使用 Criterion 的嵌套查询

java - 将 retrofit 回调值转换为返回封装对象

java - 线程中的每个操作都发生在该线程中按程序顺序稍后出现的每个操作之前

java - 执行者服务问题

c++ - boost condition_variable 等待多个锁

concurrency - JDK8中的ConcurrentHashmap代码解释

java - 一个应用程序依赖于其他应用程序的结果,我们如何在Java中实现这一点?

java - Jackson Objectmapper 读取具有可变字段/值类型的对象

java - 注册不是封闭类