java - 如何在 Java 中正确制作线程安全的单例工厂?

标签 java singleton factory-pattern

<分区>

这是我第一次编写Factory 类。下面是我的工厂类,我不确定这是否是创建线程安全单例工厂类的正确方法。我将使用该工厂返回我的客户实例吗?

public class ClientFactory {

    private static ClientFactory instance = null;   

    private ClientFactory() {

    }

    public static ClientFactory getInstance() {

        if (instance == null)
        {
            instance =  new ClientFactory();
        }

        return instance;
    }

    public IClient getClient() {

        return new TestClient();
    }
}

这是我的 TestClient 类 -

public class TestClient implements IClient {


}

这就是我将如何使用我的工厂 -

IClient client = ClientFactory.getInstance().getClient();

最佳答案

事实上,您的工厂不是线程安全的,因为在竞争条件下,您可以在应用程序中拥有多个 ClientFactory。让我们假设有两个线程:

  1. ThreadA 正在评估条件 'if (instance == null)' 并且 instance 为 null,因此它进入语句
  2. ThreadB 正在评估条件 'if (instance == null)' 并且 instance 为 null(因为 A 没有实例化它),因此它进入语句
  3. ThreadA 创建新的 ClientFactory() 并返回它
  4. ThreadB 创建新的 ClientFactory() 并返回它
  5. 现在我们在应用程序中有多个 ClientFactory。当然,稍后尝试检索实例的其他线程将始终返回单个实例。

在我看来,在 Java 中编写单例的最简单方法是使用枚举。在您的情况下,它将看起来:

public enum ClientFactory {
  INSTANCE;

  public Company getClient() {
    return new Company();
  }
}

和用法:

ClientFactory.INSTANCE.getClient()

关于java - 如何在 Java 中正确制作线程安全的单例工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21033112/

相关文章:

c# - 我应该把我的代码放在 Singleton 中的什么地方?

ios - 单例类保留 'Losing' UIImage

java - 处理构造函数逻辑的工厂类?

java - 无法从命令提示符运行maven命令,但通过eclipse成功执行

java - 在java中创建3D图像请帮忙

java - 使用 web.xml 文件从 Tomcat 中的 URL 中删除 "default.jsp"

objective-c - 全局变量/单集?

java - Spring RestTemplate.getForObject() 的 JSON 转换错误

c++ - LNK1120 类错误(工厂模式)。不确定它来自哪里

iphone - 从单个方法实例化一定数量的唯一对象