学习设计模式 - 单例模式

学习设计模式 - 单例模式

一丶定义

      确保某个类只有一个实例, 而且自行实例化并向整个系统提供这个实例.(Ensure a class has only one instance, and provide a global point of access to it.)

 

二丶五种实现方式

     1) 饿汉模式

        

public class Singleton1 {

    private static final Singleton1 instance=new Singleton1(); // 类加载时就实例化

    private Singleton1(){}  //私有构造函数

    public static Singleton1 getInstance(){
        return instance;
    }

}

 

  2) 懒汉模式 + synchronized同步锁

public class Singleton2 {

    private static  Singleton2 instance=null;

    private Singleton2(){} //私有构造函数

    public static synchronized Singleton2 getInstance(){ //每次获取单例都需要获取锁, 并发情况下性能不是很好
        if(instance==null){
            instance=new Singleton2();
        }
        return instance;
    }


}

 

synchronized同步锁

  3) 懒汉模式 + synchronized同步锁 + 双重检查

public class Singleton3 {

    //volatile确保多个线程能够可以看到实例化
    private volatile static Singleton3 instance=null;

    private Singleton3(){} //私有构造函数

    public static Singleton3 getInstance(){
        if(instance==null){//第一次检查
            synchronized (Singleton3.class){
                if(instance==null){//第二次检查
                    instance=new Singleton3();
                }
            }
        }
        return instance;
    }


}

 

   4)l懒汉模式 + 内部类

public class Singleton4 {

    private Singleton4(){}// 私有构造方法

    public static Singleton4 getInstance(){
        return InnerSingleton.instance;

    }

    //内部类
    //类在加载时, 初始化属性会收集在<clinit>方法
    //多个线程调用初始化方法,会被阻塞,确保只有一个线程调用,并保证属性的可见性
    private static class InnerSingleton {
        private static final Singleton4 instance=new Singleton4();
    }

}

 

  5) 枚举单例

public enum  Singleton5 {

    INSTANCE;

    public void doSomething(){
        System.out.println("do something");
    }

}

 

 

 

 

 

posted @ 2019-10-21 21:50  timfruit  阅读(177)  评论(0编辑  收藏  举报