gpt4 book ai didi

java - volatile 变量的突变对所有线程都可见吗?

转载 作者:行者123 更新时间:2023-12-01 22:16:53 25 4
gpt4 key购买 nike

假设我有一个对 MyClass 的 volatile 引用 c,并且 MyClass 有一个整数字段 x。如果一个线程更改了 x 的值,是否可以保证新值对所有其他线程都可见,或者 x 也必须是 volatile 的?

换句话说,下面的示例是否保证打印 2?

public class MyClass {

private static volatile MyClass c;

private int x = 1;

public static void main(String[] args) {
c = new MyClass();
Thread thread = new Thread(new Runnable() {

@Override
public void run() {
c.x = 2;

}
});
thread.start();
try {
thread.join();
System.out.println(c.x);
} catch (InterruptedException ex) {
//
}


}

如果不是,如果我想操作一个我无法控制源代码的对象(例如 Collection)怎么办?如何确保 Collection 对象的更改对所有线程都可见?

最佳答案

对于您的示例,Varialbe x 也必须是不稳定的。

If so, what if I want to manipulate an object whose source code I don't control, such as a Collection? How can I ensure that changes to the collection object are visible to all threads?

要查看集合中的变化(假设它不是并发集合,假设它是一个普通的ArrayList),您应该自己提供一个监视器。

Object monitor = new Object();

synchronized(monitor) {
// change collection
}

synchronized(monitor) {
// read collection
}

如果读写操作在监视器上同步,它们将正常工作。但是,如果您有无法控制的代码,并且此代码在不同步的情况下修改了集合,则您什么也做不了。

问题 2:即使在监视器上进行读/写同步,如果您在一个线程中迭代集合并在另一个线程中修改它,您仍然可能会遇到一些 ConcurrentModificationExceptions。因此,在我的示例中,读取不是引用读取,而是值读取。

关于java - volatile 变量的突变对所有线程都可见吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30800595/

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