单例模式的几种实现方式

这篇博客探讨了Java中实现单例模式的几种常见方法,包括饿汉式、懒汉式和双重检查锁定(DCL)策略。特别强调了DCL模式在多线程环境下的安全性,并介绍了使用静态内部类实现单例的优势,确保了线程安全且延迟初始化。
import java.util.Random;

public class Test{
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        System.out.println(instance);
        Singleton instance2 = Singleton.getInstance();
        System.out.println(instance2);
    }
}
class Singleton{
    private Singleton(){
    }
//    //饿汉式
//    private static volatile Singleton Instance = new Singleton();
//    public static Singleton getInstance(){
//        return Instance;
//    }

//    //懒汉式
//    private static volatile Singleton Instance;
//    public synchronized static Singleton getInstance(){
//        if(Instance==null){
//            Instance = new Singleton();
//        }
//        return Instance;
//    }

//    //双重检验锁(DCL)
//    private static volatile Singleton Instance;
//    /**
//     * 一定要加volatile,这是因为Instance = new Singleton();这一步并不是原子性的;会有这样三个步骤:
//     * 第一步:为需要创建的对象分配地址空间
//     * 第二步:在地址空间中初始化对象
//     * 第三步:将Instance引用指向地址空间
//     * 由于指令具有重排序优化的特性,所以可能会发生:1->3->2;(因为第二步和第三步无联系);
//     * 所以当执行完第三步时,可能对象还未初始化;
//     * 此时第二个线程访问的时候,判断Instance并不为空,则直接将未初始化的Instance返回了;
//     * 之后利用该未初始化的Instance可能会出现空指针异常的错误
//     */
//    public static Singleton getInstance(){
//        if(Instance==null){
//            synchronized (Singleton.class){
//                if(Instance==null){
//                    Instance = new Singleton();
//                }
//            }
//        }
//        return Instance;
//    }

    //静态内部类实现单例,当第一次调用getInstance方法的时候虚拟机会加载SingletonHandler类,并创建Instance实例
    public static Singleton getInstance(){
        return SingletonHandler.Instance;
    }
    private static class SingletonHandler{
        private static Singleton Instance = new Singleton();
    }
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值