gpt4 book ai didi

java - 对象构造是否是原子的?

转载 作者:行者123 更新时间:2023-12-02 00:23:18 24 4
gpt4 key购买 nike

java中的对象构造是ThreadSafe吗?请引用下面的代码片段。

//We have some peace of code
public ABCClass(SomeOtherClass obj) {

obj.setState(XYZ);

}

然后某处有 50 个线程同时构造 ABCClass 对象。在构造时,我们正在更改 SomeOtherClass 对象的状态。

我的问题是这个构造过程是原子的,否则线程会看到 SomeOtherClass 对象的陈旧状态,因为它们在所有 ABCClass 的实例之间共享。

编辑: obj 对象在所有构造函数中共享。

class SomeOtherClass{

private Status state;

public void setState(Status st){

this.state=st;
}

}
// Test Class
class TestClass{

public static void main(String[] args) {

final SomeOtherClass smc=new SomeOtherClass();

for(int i=0;i<50;i++)
{
new Thread(new Runnable() {

@Override
public void run() {
new ABCClass(smc);

}
}).start();
}
}

}

最佳答案

您的问题与构造函数无关,而是与在线程之间共享该 SomeOtherClass obj 并同时对其进行修改 - 这是一个并发问题。您必须确保该对象的所有突变都是线程安全的。

更新

从下面的评论中证明这一点的代码:

public class Test {
static Test t1;
public Test() {
System.out.println("Constructing Test");
t1 = this;
try { Thread.sleep(2000); } catch (Exception e) {}
System.out.println("Almost done");
}
public static void main(String[] args) throws InterruptedException {
new Thread() { public void run() { new Test(); }}.start();
Thread.sleep(1000);
System.out.println(t1);
}
}

关于java - 对象构造是否是原子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10530348/

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