JAVA设计模式(一)单例模式

单例类只能有一个实例。
单例类必须自己创建自己的唯一实例。

单例类必须给所有其他对象提供这一实例。

1、懒汉式,线程不安全

  private static Singleton instance;  
    private Singleton (){}  
  
    public static Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
    懒汉式是典型的时间换空间,就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间

2、懒汉式,线程安全

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

    懒汉式单例类实现里对静态工厂方法使用了同步化,以处理多线程环境。

3、饿汉式

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

    饿汉式是典型的空间换时间,当类装载的时候就会创建类的实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断,节省了运行时间。

4、双检锁/双重校验锁

private volatile static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance(){
    //先检查实例是否存在,如果不存在才进入下面的同步块
    if(instance == null){
       //同步块,线程安全的创建实例
       synchronized (Singleton.class) {
           //再次检查实例是否存在,如果不存在才真正的创建实例
           if(instance == null){
              instance = new Singleton();
           }
       }
    }
     return instance;
}

    这种实现方式既可以实现线程安全地创建实例,而又不会对性能造成太大的影响。它只是第一次创建实例的时候同步,以后就不需要同步了,从而加快了运行速度。

5、静态内部类

 private static class SingletonHolder {  
    private static final Singleton INSTANCE = new Singleton();  
 }  
 private Singleton (){}  
 public static final Singleton getInstance() {  
    return SingletonHolder.INSTANCE;  
 }  

    当getInstance方法第一次被调用的时候,它第一次读取SingletonHolder.instance,导致SingletonHolder类得到初始化;而这个类在装载并被初始化的时候,会初始化它的静态域,从而创建Singleton的实例,由于是静态的域,因此只会在虚拟机装载类的时候初始化一次,并由虚拟机来保证它的线程安全性。

    这个模式的优势在于,getInstance方法并没有被同步,并且只是执行一个域的访问,因此延迟初始化并没有增加任何访问成本。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值