Java:静态工厂方法和线程安全

时间:2012-03-28 09:26:56

标签: java

我希望通过静态工厂方法获取对象,例如

Person p = Person.fromName("Jack");

class Person {
    public static Person fromName(String name){
        return new Person(name);
    }
}

但fromName()方法不是线程安全的,(fromName()只是一个例子,这种方法在我的程序中运行时会发生错误)但是,如果同步这个方法效率很低,因为多个线程应该调用这个方法同时进行。有什么建议可以解决吗?

2 个答案:

答案 0 :(得分:2)

如果你有同时在多个线程中执行不安全的代码,但你想从多个线程调用它,听起来你真的只有两个选择:

  • 使线程安全
  • 通过同步
  • 进行序列化调用

您尚未提供任何可能表明哪种情况最适合您的情况的信息。 (您是否测量过同步性能?是否尝试过使用线程安全?)

答案 1 :(得分:1)

当你说

时,你的问题似乎无法解决

A)该方法不是线程安全的(因此需要以同步的方式使用)和

B)由于效率原因,它可能无法同步。

我能给你的唯一建议是尽可能地执行细粒度同步,即只对该方法的线程不安全的部分进行同步。

例如,如果声明S1需要与S2一起原子地执行,那么您可以而不是

public synchronized static Person fromName(String name){
    ...
    S1;
    S2;
    ...
    return ...;
}

DO

public static Person fromName(String name){
    ...
    synchronized (lock) {
        S1;
        S2;
    }
    ...
    return ...;
}