单列模式 Singleten

本文详细介绍了单例模式的概念、优缺点,并探讨了不同实现方式,包括饿汉式、懒汉式及其各种变种,如静态内部类、双重校验锁以及推荐的枚举实现。每种方式都分析了其在性能和线程安全方面的特点。

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


一、单列模式(Singleten)概念

1.原理

单例模式的类中有且仅有一个实例被创建,其他的类要使用单例对象时都要通过这个类提供的特殊渠道来进行获取。
1.如果不想有那么多的实例,构造方法私有化。
2.提供一种方式来获取该实例,且保证实例只有一个

2.单列模式的优缺点

1.优点:
单例模式可以保证内存里只有一个实例,减少了内存的开销。
可以避免对资源的多重占用。
单例模式设置全局访问点,可以优化和共享资源的访问。

2.缺点:
单例模式一般没有接口,扩展困难。如果要扩展,则除了修改原来的代码,没有第二种途径,违背开闭原则。
在并发测试中,单例模式不利于代码调试。在调试过程中,如果单例中的代码没有执行完,也不能模拟生成一个新的对象。
单例模式的功能代码通常写在一个类中,如果功能设计不合理,则很容易违背单一职责原则。

二、饿汉

优点

1.没有加锁,执行效率高
2.类加载的时候,创建一个实例,避免多线程同步问题

缺点

1.每次类加载都会创建一个实例,浪费内存空间
代码如下(示例):

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() { }
    public static Singleton getInstance() {
        return instance; 
    }
}

三、饿汉(变种)

类实例化的过程放在了静态代码块中,也是在类装载的时候,就执行静态代码块中的代码,初始化类的实例

代码如下(示例):

public class Singleton {
    private static Singleton instance = null;
    static {
        instance = new Singleton();
    }
    private Singleton() { }
    public static Singleton getInstance() {
        return this.instance; 
    }
}

四、懒汉(非线程安全)

优点:

需要时,才创建,资源优化

缺点

没有考虑线程安全,多线程并发调用getinstance时,可能会创建多个实例

代码如下(示例):

public class Singleton {
    private static Singleton instance = null;
    private Singleton() { }
    public static Singleton getInstance() {
          if (instance == null) {
                instance = new Singleton();
          }
        return instance;
    }
}

五、懒汉变种1(线程安全)

如何变得安全:
// 实例上加volatile
// 方法上加 synchronized

优点

同上且安全

缺点

加锁synchronsized,所以效率降低

代码如下(示例):

public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    } 
}

六、懒汉变种2(加锁优化,延迟)

优点

优化了加锁造成的效率低的问题

缺点

还是不安全的线程,当多个线程同时进入if(singleTon == null),都会继续往下走
代码如下(示例):

public class SingleTon {
    private static SingleTon singleTon;
    private SingleTon(){
    }
    public static SingleTon getInstance(){
        if(singleTon == null){
            synchronized (SingleTon.class){
                singleTon = new SingleTon();
            }
        }
        return singleTon;
    }

七、懒汉变种3(静态内部类)

优点

1.避免了线程不安全,延迟加载
2.效率高
代码如下(示例):

public class Singleton{
    private static class SingletonHolder{
        public static Singleton instance = new Singleton();
    }
    private Singleton(){}
    public static Singleton newInstance(){
        return SingletonHolder.instance;
    }

八、懒汉变种4(双重校验锁)

优点

同懒汉
解决多线程并发问题
执行效率变高
安全

public class Singleton {
    private static volatile Singleton instance = null;
    private Singleton(){}
    public static Singleton getInstance() {
        if (instance == null) { // Single Checked
            synchronized (Singleton.class) {
                if (instance == null) { // Double checked
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

九、枚举(推荐使用)

优点

线程安全,为了线程安全不用写额外代码做控制

缺点

class Resource{
}
public enum SomeThing {
    INSTANCE;
    private Resource instance;
    private SomeThing() {
        instance = new Resource();
    }
    public Resource getInstance() {
        return instance;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值