设计模式-单例模式

单例模式-Singleton Pattern

单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例
这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。

单例模式有三个要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

饿汉式单例、带双重检查锁定机制的懒汉式单例、IoDH


饿汉式单例:
        在定义静态变量的时候实例化单例类,因此在类加载的时候就已经创建了单例对象
        
        ==========================================================
        class EagerSingleton {   
            private static final EagerSingleton instance = new EagerSingleton();   
            private EagerSingleton() { }   
          
            public static EagerSingleton getInstance() {  
                return instance;   
            }     
        }
        ==========================================================
        
带双重检查锁定机制的懒汉式单例:
        如果使用双重检查锁定来实现懒汉式单例类,需要在静态成员变量instance之前增加修饰符volatilevolatile修饰的成员变量可以确保多个线程都能够正确处理,且该代码只能在JDK 1.5及以上版本中才能正确执行。
        由于volatile关键字会屏蔽Java虚拟机所做的一些代码优化,可能会导致系统运行效率降低,
        因此即使使用双重检查锁定来实现单例模式也不是一种完美的实现方式。
        
        ==========================================================
        class LazySingleton { 
            private volatile static LazySingleton instance = null; 
        
            private LazySingleton() { } 
        
            public static LazySingleton getInstance() { 
                //第一重判断
                if (instance == null) {
                    //锁定代码块
                    synchronized (LazySingleton.class) {
                        //第二重判断
                        if (instance == null) {
                            instance = new LazySingleton(); //创建单例实例
                        }
                    }
                }
                return instance; 
            }
        }
        ===========================================================
        
        
IoDH:在IoDH中,我们在单例类中增加一个静态(static)内部类,在该内部类中创建单例对象,
      再将该单例对象通过getInstance()方法返回给外部使用
//Initialization on Demand Holder
public class Singleton {
    private Singleton() {
    }

    //静态内部类
    private static class HolderClass {
        private final static Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
        return HolderClass.instance;
    }

    public static void main(String args[]) {
        Singleton s1, s2;
        s1 = Singleton.getInstance();
        s2 = Singleton.getInstance();
        System.out.println(s1==s2);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值