JAVA 单例模式的靠谱写法

简介

单例模式的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个对象实例。

写法1(静态常量)

写法简单,但没有懒加载,可能会资源浪费。

public class Singleton {

    private final static Singleton INSTANCE = new Singleton();

    private Singleton(){}
    public static Singleton getInstance(){
        return INSTANCE;
    }
}

或者:

public class Singleton {

    private static Singleton instance;

    static {
        instance = new Singleton();
    }

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}

写法2(Double-Check)

线程安全;延迟加载;效率较高。

public class Singleton {

    private static Singleton singleton;
    
	//关闭默认构造方法,禁止new对象
    private Singleton() {}
    
	//仅能通过此方法获取Singleton实例
    public static Singleton getInstance() {
        if (singleton == null) { //一次检查
            synchronized (this) { //添加同步块,防止多线程初始化singleton
                if (singleton == null) { //二次检查,防止后续排队任务再次初始化
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

写法3(内部静态类)

1、静态内部类在外部类被装载时并不会立即实例化,而是在被调用时才会被加载。
2、类的静态属性只会在第一次加载类的时候初始化,JVM保证了线程的安全性。

线程安全,延迟加载,效率高。

public class Singleton {

    private Singleton() {}

    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

推荐后两种写法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值