单例模式

本文详细介绍了单例模式的多种实现方式,包括饿汉式、懒汉式、双重校验锁及枚举式等,并对比了它们的特点与适用场景。特别推荐使用枚举式和内部类方式实现单例模式。

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

单例模式

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

线程安全,效率低,不推荐使用。

懒汉式
public class Singleton {  

    private static Singleton instance=null;  

    private Singleton() {};  

    public static Singleton getInstance(){  

        if(instance==null){  
            instance=new Singleton();  
        }  
        return instance;  
    }  
}  

线程不安全,不可用

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

线程安全,效率低,不推荐使用

懒汉式双重校验锁

public class Singleton {  
    private static Singleton instance=null;  
    private Singleton() {};  
    public static Singleton getInstance(){  
         if (instance == null) {    //第一重校验,线程不安全,有多个线程可能同时得到Singleton的值为null,
              synchronized (Singleton.class) {    //同步块代码,保证只有一条线程进入此方法
                  if (instance == null) {    //此时创建了对象,其他线程进入的时候就会判断为false,直接返回以前创建的对象。
                      instance = new Singleton();    
                  }    
              }    
          }    
          return instance;    
    }  
}  
枚举式
public enum Singleton{
    instance;
    private Singleton(){};
    public void whateverMethod(){//自定义类中的方法
    };
}

不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。推荐使用

使用方法:Singleton.instance.whateverMethod();
de>
内部类
public class SingletonIn {
    private SingletonIn() {
    }
    private static class SingletonInHodler {
        private static SingletonIn singletonIn = new SingletonIn();
    }
    public static SingletonIn getSingletonIn() {
        return SingletonInHodler.singletonIn;
    }
}

这种方式跟饿汉式方式采用的机制类似,但又有不同。两者都是采用了类装载的机制来保证初始化实例时只有一个线程。不同的地方:在饿汉式方式是只要Singleton类被装载就会实例化,内部类是在需要实例化时,调用getInstance方法,才会装载SingletonHolder类。
优点:避免了线程不安全,延迟加载,效率高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值