Java 工厂级螺纹安全
我有一个工厂类,比如说ApppleFactory,它通过调用getApple方法创建一个新的Apple实例。ApppleFactory只有一个共享实例 现在,如果多个线程访问这个getApple并使用这个可变数据apple,那么可能会出现不安全的情况。如何克服这个问题?显然,静电场就是问题所在。把它扔掉Java 工厂级螺纹安全,java,multithreading,Java,Multithreading,我有一个工厂类,比如说ApppleFactory,它通过调用getApple方法创建一个新的Apple实例。ApppleFactory只有一个共享实例 现在,如果多个线程访问这个getApple并使用这个可变数据apple,那么可能会出现不安全的情况。如何克服这个问题?显然,静电场就是问题所在。把它扔掉 class ApppleFactory { public Apple getApple() { Apple apple = new Apple(); //
class ApppleFactory {
public Apple getApple() {
Apple apple = new Apple();
//do some other work on this apple instance
return apple; //finally return it
}
}
每次在getApple中创建新实例时,不需要apple字段。
因此,您可以删除它:
class ApppleFactory {
private ApppleFactory() {
}
public static Apple getApple() {
Apple apple = new Apple();
//do some other work on this apple instance
return apple; //finally return it
}
}
现在,如果您需要更改,并且希望在factory类的其他地方重用此字段,那么该类将是非常可变的,您应该使用显式同步来创建和检索Apple实例。
例如,对于依赖静态修饰符的实际实现:
class ApppleFactory {
private static Apple apple;
private ApppleFactory() {
}
public static synchronized Apple getApple() {
apple = new Apple();
//do some other work on this apple instance
return apple; //finally return it
}
public static synchronized void consumeApple() {
apple.eatByMe();
}
}
请注意,在工厂中仅提供静态方法将类的客户端与类强烈耦合。作为替代方案,您可以使用经典的单例、枚举单例模式或依赖项注入容器将客户端方法更改为实例方法。同步该方法。
class ApppleFactory {
private static Apple apple;
private ApppleFactory() {
}
public static synchronized Apple getApple() {
apple = new Apple();
//do some other work on this apple instance
return apple; //finally return it
}
public static synchronized void consumeApple() {
apple.eatByMe();
}
}