Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading - Fatal编程技术网

Java 工厂级螺纹安全

Java 工厂级螺纹安全,java,multithreading,Java,Multithreading,我有一个工厂类,比如说ApppleFactory,它通过调用getApple方法创建一个新的Apple实例。ApppleFactory只有一个共享实例 现在,如果多个线程访问这个getApple并使用这个可变数据apple,那么可能会出现不安全的情况。如何克服这个问题?显然,静电场就是问题所在。把它扔掉 class ApppleFactory { public Apple getApple() { Apple apple = new Apple(); //

我有一个工厂类,比如说ApppleFactory,它通过调用getApple方法创建一个新的Apple实例。ApppleFactory只有一个共享实例

现在,如果多个线程访问这个getApple并使用这个可变数据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();
    }

}