Java单例模式的9种实现方式

Java单例模式的9种实现方式JAVA 单例模式的 9 种实现方式一 饿汉式二 懒汉式 线程不安全三 懒汉式 线程安全四 双检锁 双重校验锁 DCL 即 double checkedlocki 五 静态内部类六 枚举七 双检锁 双重校验锁 DCL 即 double checkedlocki 加 volatile 八 使用 ThreadLocal 实现单例九 使用 CAS 锁实现单例

Java单例模式的9种实现方式

Java单例模式的9种实现方式

一.饿汉式
public class Singleton { 
    private static Singleton instance = new Singleton(); private Singleton (){ 
   } public static Singleton getInstance() { 
    return instance; } } 

JDK中,java.lang.Runtime就是典型的使用饿汉式的单例模式

二.懒汉式,线程不安全
public class Singleton { 
    private static Singleton instance; private Singleton (){ 
   } public static Singleton getInstance() { 
    if (instance == null) { 
    instance = new Singleton(); } return instance; } } 
三.懒汉式,线程安全
public class Singleton { 
    private static Singleton instance; private Singleton (){ 
   } public static synchronized Singleton getInstance() { 
    if (instance == null) { 
    instance = new Singleton(); } return instance; } } 
四.双检锁/双重校验锁(DCL,即 double-checked locking)

JDK 版本:JDK1.5 起

public class Singleton { 
    private volatile static Singleton singleton; private Singleton (){ 
   } public static Singleton getSingleton() { 
    if (singleton == null) { 
    synchronized (Singleton.class) { 
    if (singleton == null) { 
    singleton = new Singleton(); } } } return singleton; } } 
五.静态内部类
public class Singleton { 
    private static class SingletonHolder { 
    private static final Singleton INSTANCE = new Singleton(); } private Singleton (){ 
   } public static final Singleton getInstance() { 
    return SingletonHolder.INSTANCE; } } 
六.枚举

JDK 版本:JDK1.5 起

public enum Singleton { 
    INSTANCE; public void whateverMethod() { 
    } } 
七.双检锁/双重校验锁(DCL,即 double-checked locking)(加volatile)

JDK 版本:JDK1.5 起

public class Singleton { 
    # 使用volatile设置内存屏障,确保线程访问资源可见性。 private volatile static Singleton singleton; private Singleton (){ 
   } public static Singleton getSingleton() { 
    if (singleton == null) { 
    synchronized (Singleton.class) { 
    if (singleton == null) { 
    singleton = new Singleton(); } } } return singleton; } } 
八.使用ThreadLocal实现单例
public class Singleton { 
    // 用空间换时间 private static final ThreadLocal<Singleton> tl = new ThreadLocal<Singleton>(); @Override protected Singleton initialValue() { 
    return new Singleton(); } private Singleton() { 
   } public static Singleton getInstance() { 
    return tl.get(); } } 
九.使用CAS锁实现单例
private static final AtomicReference<Singleton> INSTANCE = new AtomicReference<Singleton>(); private Singleton() { 
    } public static final Singleton getInstance() { 
    for (; ; ) { 
    Singleton current = INSTANCE.get(); if (current != null) { 
    return current; } current = new Singleton(); if (INSTANCE.compareAndSet(null, current)) { 
    return current; } } } 

我的学习论坛

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205032.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午6:57
下一篇 2026年3月19日 下午6:58


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号