创建新对象线程是否安全

时间:2014-05-23 14:40:12

标签: java

方法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;
    }
}

2 个答案:

答案 0 :(得分:1)

在你的例子中,String是不可变的,不可访问,那么你的构造函数将是线程安全的。

但是,如果用任意对象(比如说另一个类)替换字符串并为这些对象设置setter,那么可能会遇到有关线程安全性的问题。因此,对于您的问题的更一般的答案,不,构造函数,像任何其他方法一样,不提供明确的线程安全机制,由您来确保您的操作是线程安全的。

如果您的类包含静态字段,那么构造函数本身可能会遇到线程安全问题。

答案 1 :(得分:0)

直到从委托人委派this引用为线程安全。之后,它不再是线程安全的。

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

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

相关:Constructor synchronization in Java