gpt4 book ai didi

Java 线程安全和原语

转载 作者:行者123 更新时间:2023-12-01 18:29:43 26 4
gpt4 key购买 nike

我有一个包含一些原始变量的对象

public class Myobject {
public final double d
public long a
}

我存储在一组不同步的所有对象

private Set<Myobject> myset = new HashSet<>()

现在我想将这些对象传递到另一个线程并执行一些计算。在这个线程中我只会读取变量“d”和“a”,变量不会改变我的问题是创建不可修改的集合是否线程安全 Collections.unmodifierset(myset);并将其传递给第二个线程。

最佳答案

您有两个基本选项可以安全地发布对对象图根的引用:

  • 确保构建对象图的线程是启动将使用它的(所有)子线程的线程;

  • 将对完全构造的对象图的引用写入 volatile 变量。

这两种方法都确保所有线程间的发生之前关系 store构建对象图和所有线程间时执行的操作 load其他线程将针对同一图执行的操作。由于第一个线程间操作保证是 load (阅读根引用),这意味着所有 store 都有一个 happens-before其他线程的操作也是如此。因此,在另一个线程中读取和写入对象都是线程安全的 - 只要它是另一个线程,而不是其他线程之一

作为标准预防措施,我引用了 JLS, §17.4.4 中的这些引文。 :

  • A write to a volatile variable v (§8.3.1.4) synchronizes-with all subsequent reads of v by any thread (where "subsequent" is defined according to the synchronization order).

  • An action that starts a thread synchronizes-with the first action in the thread it starts.

关于Java 线程安全和原语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24839061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com