Java单例模式的四种写法(优点、缺点以及解决方案)

/*
    懒汉模式:
    优点:节约了空间
    缺点:线程不安全,反射破解问题
 */
public class SingleTon {
    //使用懒汉模式
    //使用volatile禁止指令集重排序
    private static volatile SingleTon instance;

    private SingleTon() {
        synchronized (SingleTon.class) {
            if (instance != null) {//解决反射破解问题
                throw new RuntimeException("不能使用反射创建实例化对象");
            }
        }
    }

    public static SingleTon getInstance() {
        if (instance == null) {//提高代码执行效率
            synchronized (SingleTon.class) {//多线程时,保证线程安全
                if (instance == null) {
                    instance = new SingleTon();
                }
            }
        }
        return instance;
    }

}

/*
    饿汉模式:
    优点:线程安全
    缺点:浪费空间,反射破解问题
*/
class SingleTon1 {
    private static final SingleTon1 INSTANCE = new SingleTon1();

    private SingleTon1() {
        synchronized (SingleTon1.class) {
            if (INSTANCE != null) {
                throw new RuntimeException("不能使用反射创建实例化对象");
            }
        }

    }

    public static SingleTon1 getInstance() {
        return INSTANCE;
    }
}

/*
静态内部类(最常用的):
优点:线程安全,节约空间
缺点:反射破解问题
*/
class SingleTon3 {

    private SingleTon3() {
        synchronized (SingleTon3.class) {
            if (Holder.INSTANCE != null) {
                throw new RuntimeException("不能使用反射创建实例化对象");
            }
        }
    }

    static class Holder {
        private static final SingleTon3 INSTANCE = new SingleTon3();
    }

    public static SingleTon3 getInstance() {

        return Holder.INSTANCE;
    }
}

/*
使用枚举的方式:
优点:线程安全,没有反射破解问题
缺点:浪费空间
*/
enum SingleTon4 {
    INSTANCE;

    public static SingleTon4 getInstance() {
        return INSTANCE;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值