Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:静态工厂方法和线程安全_Java - Fatal编程技术网

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

Java:静态工厂方法和线程安全,java,Java,我希望通过静态工厂方法获取对象,例如 Person p = Person.fromName("Jack"); class Person { public static Person fromName(String name){ return new Person(name); } } 但是fromName()方法不是线程安全的,(fromName()只是一个示例,这种方法在我的程序中运行时会出错),但是,如果同步此方法,则效率低下,因为多个线程应该同时调用此方

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

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

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

但是fromName()方法不是线程安全的,(fromName()只是一个示例,这种方法在我的程序中运行时会出错),但是,如果同步此方法,则效率低下,因为多个线程应该同时调用此方法。有没有修复它的建议?

如果您有一些代码在多个线程中同时执行是不安全的,但是您想从多个线程调用它,那么听起来您实际上只有两个选项:

  • 确保线程安全
  • 通过同步实现连续调用的成功

您还没有提供任何信息来说明以下哪项最适合您的情况。(您是否测量了同步的性能影响?是否尝试使其线程安全?

您这样说似乎无法解决您的问题

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

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

我能给你的唯一建议是尽可能地执行细粒度的同步化,即只同步方法中不安全的部分

例如,如果语句
S1
需要与
S2
一起原子地执行,则可以不执行

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


那么您想要一个ObjectPool,它为相同的给定名称返回相同的Person实例?否则,应该不会有任何问题。您希望使线程安全,并允许多个线程同时访问它。@ChandraSekhar是的,这就是我想要的!实际上,无状态方法调用(如示例中所示)是线程安全的。谢谢,我知道如果没有同步,我无法使用静态工厂方法,因此我决定使用对象方法而不是类方法。当然可以使用同步的静态方法。谁告诉过你不能在静态方法中使用
synchronized
?是的,我已经尝试使其线程安全,但效率低下,所以我决定使用对象方法而不是类方法。多谢各位much@remy:这真的不能解释你在做什么。。。听起来您可能对线程安全涉及的内容有一些不确定的看法。。。
public static Person fromName(String name){
    ...
    synchronized (lock) {
        S1;
        S2;
    }
    ...
    return ...;
}