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

标签 java multithreading concurrency

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/

相关文章:

multithreading - 在多处理过程中使用队列是否使用酸洗?

java - 何时以及如何使用额外的 ConcurrentHashMap 同步?

python - 将当前目录(使用 os.cwd)保存到 TCP 服务器 Python

java - BufferedImage 的后台创建以及与信号量的同步

java - Android - 多个 Activity 重启的并发问题

java - 尝试使用 java 创建 GUI,但无法按照我想要的方式实现它们

java - 正则表达式:/w 是否表示 [a-zA-Z] 或 [a-zA-Z0-9_] 正如大多数教程提到的\w - 匹配单词字符?

java - 如何取消特定的Kotlinc/Javac编译器警告?

java - JAR 文件未打开(用 winRAR 打开)?

Android在蓝牙套接字上设置超时