剑指Offer--题目2:实现单例模式

本文详细介绍了单例模式的概念及其在Java中的实现方式。探讨了单例模式的不同实现方案,包括适用于单线程环境的简单实现、多线程环境下的同步方法及双重检查锁定等,并分析了各自的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是单例模式:

剑指Offer我买的是C++版本的,我仿照C++写Java的示例代码
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
简单理解就是对于一个类来说,它的对象是特殊的,也就是说它的对象只能存在0和1个。

方案一:只适用于单线程的写法:

public class SingleTonMode {
    //创建一个唯一的实例instance
    private static SingleTonMode justMe=null;
    //将实例方法进行隐藏,private关键字可以实现隐藏构造方法
    private SingleTonMode(){
        
    }
    //公共方法获取此唯一的实例
    public static SingleTonMode getjustMe(){
        if(justMe == null){
            justMe = new SingleTonMode();
        }
        return justMe;
    }
}

此代码仅在SingleTon的静态属性JustMe中,只有在JustMe为空的时候才创建一个实例避免重复,同时我们将构造函数定义为私有函数,这样就不会新建实例。Static属于类方法,可以直接通过类调用。

方案二:效率不高的多线程工作方案:

public class SingleTonMode2 {
    //私有化静态方法
    private SingleTonMode2(){
    }
    private static SingleTonMode2 justMe=null;
    public static synchronized SingleTonMode2 getJustMe() throws InterruptedException {
            if(justMe == null){
                justMe = new SingleTonMode2();
            }
        return justMe;
    }
}

使用重锁synchronized保证justMe同一时刻只会被一个线程获取锁,当第一个线程获取锁,第二个线程只能等待,就不会产生生产多个对象的问题。

但是这样会产生效率问题,比如说你都新建过对象了,就不会重复创建了,锁可有可无。

加锁前后进行两次判断实例是否已经存在

public class SingleTonMode3 {
    private SingleTonMode3(){

    }
    private static SingleTonMode3 justMe=null;
    public static  SingleTonMode3 getJustMe(){
        if(justMe == null){
            synchronized (SingleTonMode3.class){
                justMe = new SingleTonMode3();
            }
        }
        return justMe;
    }

}

利用静态函数构造函数(饿汉)

经典饿死鬼方式:假如我一开始就生成了这个单例,就没人可以生成此对象了

public class SingleTonMode4 {  
    private static  SingleTonMode4 justMe = new  SingleTonMode4();  
    private SingleTonMode4 (){}  
    public static SingleTonMode4 getJustMe() {  
    return justMe;  
    }  
}

实现按需创建实例

public class SingleMode5 {
    private static class SingletonHolder {
        private static final SingleMode5 JustMe = new SingleMode5();
    }
    private SingleMode5 (){}
    public static final SingleMode5 getJustMe() {
        return SingletonHolder.JustMe;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值