java - 枚举性能中的单例

标签 java multithreading enums

我想知道枚举中的单例及其性能。

当我们拥有多线程环境时,我们必须在创建实例时同步时刻。

简单地说,我们可以使用 synchronized mod,用于创建实例的名为 getInstance() 的函数 像这样的想法:

public synchronized Singleton getInstance(){
    if(instance == null){
        instance = new Singleton();
    }
    return instance;
}

这是一种懒惰的实现,对我来说很好。但是同步方法很慢。 我们可以使用双锁来让它更快。

枚举怎么样? 当我们将单例实现为枚举时,单例实例将在首次使用时创建。下次使用,返回当前实例。

它是如何工作的? 当我们想要获取现有实例时,隐式同步方法很慢?还是实现了双锁?

最佳答案

Enum 是线程安全的,也是 the recommended way实现单例。

也就是说,枚举不是延迟加载的。如果你想要一个延迟加载的单例,你可以使用 Holder pattern (这也是线程安全的):

class LazySingleton {

    private LazySingleton() {}

    private static class SingletonHelper{
        private static final LazySingleton INSTANCE = new LazySingleton();
    }

    public static LazySingleton getInstance(){
        return SingletonHelper.INSTANCE;
    }
}

关于java - 枚举性能中的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47502406/

相关文章:

design-patterns - 枚举 vs 查找表 vs 枚举反射 vs 状态模式

java - 对象不变性的单元测试

java - 使用 LinkedBlockingQueue 对多线程 java 程序足够好吗?

multithreading - 使用 -N(并行)标志运行时 GHC 在做什么?

c++ - 在 Linux 的情况下替换 Windows 特定的 HANDLE、事件创建和同步 API

node.js - Sequelize : Change column type to ENUM

java - 在Java中调用枚举变量

java - 比较一个类的两个列表而不迭代列表

java - java代码中的If Else错误

java - ant junit 任务不报告详细信息