java - 这是 Java 中线程安全延迟加载单例的良好实现吗?

标签 java multithreading singleton lazy-initialization

我想在 Java 中实现线程安全的延迟加载单例。

这是一个好的设计吗?

public final class ThreadSafeLazySynchronizedSingleton {

private ThreadSafeLazySynchronizedSingleton(){}

private static ThreadSafeLazySynchronizedSingleton instance;

public static ThreadSafeLazySynchronizedSingleton getSynchronizedInstance(){
    synchronized(ThreadSafeLazySynchronizedSingleton.class){ 
        if (instance==null){
            instance = new ThreadSafeLazySynchronizedSingleton();
        }
        return instance;
    }
}

}

我还想创建一个无锁版本,用于一个线程比其他线程访问单例多次的场景,我将如何使用 Java 中的原子对象(即 AtomicBoolean 或 AtomicReference 等)实现这一点。你能提供一个代码示例吗?

最佳答案

更好的设计应该是

public final class ThreadSafeLazySynchronizedSingleton {

    private ThreadSafeLazySynchronizedSingleton(){}

    private static volatile ThreadSafeLazySynchronizedSingleton instance;

    public static ThreadSafeLazySynchronizedSingleton getSynchronizedInstance(){
        if (instance==null)
            synchronized(ThreadSafeLazySynchronizedSingleton.class){ 
                if (instance==null){
                    instance = new ThreadSafeLazySynchronizedSingleton();
                }
        return instance;
        }
    }
}

然而,恕我直言,最好的设计是

public enum ThreadSafeLazySynchronizedSingleton {
    INSTANCE;
}

关于java - 这是 Java 中线程安全延迟加载单例的良好实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24434566/

相关文章:

java - 从 Windows 命令行运行时如何请求 JVM 垃圾回收(不是从代码)

Pythonic 方式了解我的线程何时/为何退出

C:暂停 system() 调用

javascript - 从类静态方法调用 ES6 类构造函数

java - UPDATE 查询在 UserDAO.java 中给我带来了麻烦

Java shl和shr填充问题

java - 将二维数组写入字符串,然后写入 .txt 文件 - Java

按下后退按钮后android线程仍在运行

ios - 单例下载管理器?

c++ - 在运行时反复使用和对象的最佳实践是什么