创建新对象是线程安全的吗?

4

以下代码中的 getCopyOf 方法在 Java 中是线程安全的吗? 我不确定对象的构造是否是原子操作。

public class SomeClass {
    private final String arg1;
    private final String arg2;

    public SomeClass(String arg1, String arg2){
        this.arg1= arg1;
        this.arg2 = arg2;
    }

    public SomeClass getCopyOf() {
        return new SomeClass(this.arg1,this.arg2);
    }

    public String getArg1(){
        return arg1;
    }

    public String getArg2(){
        return arg2;
    }
}

7
如果SomeClass是不可变的,那么根本不需要创建SomeClass对象的副本——你根本不需要getCopyOf方法。 - Jesper
2个回答

1
在您的示例中,是的,由于String是不可变且不可访问的,因此您的构造函数将是线程安全的。
但是,如果您将字符串替换为任意对象(比如另一个类),并为这些对象设置setter,则可能会遇到有关线程安全性的问题。因此,对于您的问题的更一般的答案是,构造函数像任何其他方法一样,不提供显式的线程安全机制,而是由您确保操作是线程安全的。
更糟糕的是,如果您的类包含静态字段,则构造函数本身可能会存在线程安全问题。

0

它是线程安全的,直到你从构造函数中委托this引用。之后它就不再是线程安全的了。

public class MyClass {
    public MyClass(Object someObject) {
        someObject.someMethod(this); // can be problematic
    }
}

这只是一个例子,我认为你可以想象出一些可能会出现线程安全问题的场景。

相关链接:Java中的构造函数同步


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接