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/