【问题标题】:Is creation of new object thread safe创建新对象线程是否安全
【发布时间】:2014-05-23 14:40:12
【问题描述】:

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

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

【问题讨论】:

  • 如果SomeClass 是不可变的,则根本不需要创建SomeClass 对象的副本——你根本不需要getCopyOf 方法。

标签: java


【解决方案1】:

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

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

即使你的类包含静态字段,那么构造函数本身也可能存在线程安全问题。

【讨论】:

    【解决方案2】:

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

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

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

    相关:Constructor synchronization in Java

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多