- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含一些原始变量的对象
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 ofv
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/
我是一名优秀的程序员,十分优秀!