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