单例模式

2018-03-07  本文已影响0人  luoqiang108

单例模式Singleton

public class Test {
    public static void main(String[] args) {
        //饿汉模式
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        if(s1==s2){
            System.out.println("s1和s2是同一个实例");
        }else{
            System.out.println("s1和s2不是同一个实例");
        }
        
        //懒汉模式
        Singleton2 s3=Singleton2.getInstance();
        Singleton2 s4=Singleton2.getInstance();
        if(s3==s4){
            System.out.println("s3和s4是同一个实例");
        }else{
            System.out.println("S3和s4不是同一个实例");
        }
        
    }
}
/*
 * 饿汉模式
 */
public class Singleton {
    //1.将构造方法私有化,不允许外部直接创建对象
    private Singleton(){        
    }
    
    //2.创建类的唯一实例,使用private static修饰
    private static Singleton instance=new Singleton();
    
    //3.提供一个用于获取实例的方法,使用public static修饰
    public static Singleton getInstance(){
        return instance;
    }
}
/*
 * 懒汉模式
 * 区别:饿汉模式的特点是加载类时比较慢,但运行时获取对象的速度比较快,线程安全
 *      懒汉模式的特点是加载类时比较快,但运行时获取对象的速度比较慢,线程不安全
 */
 /*
 * 懒汉模式线程不安全原因:
 * 从线程安全性上讲,不加同步的懒汉式是线程不安全的。
 * 假设开始线程0进入,判断instance为空,在将要创建实例时,
 * cpu切换,线程1又进来了,同样instance为空 创建了实例,
 * 这时cpu切换回来到0线程,继续创建实例,这就会出现两个实例。
 * 所以为了安全使用饿汉模式,在类加载时创建实例,或者使用同步加锁。
 */
public class Singleton2 {
    //1.将构造方式私有化,不允许外边直接创建对象
    private Singleton2(){
    }

    //2.声明类的唯一实例,使用private static修饰
    private static Singleton2 instance;

    //3.提供一个用于获取实例的方法,使用public static修饰
    public static Singleton2 getInstance(){
        if(instance==null){
            synchronized (Singleton2.class){
                if (instance==null){
                    instance=new Singleton2();
                }
            }
        }
        return instance;
    }
}

简书Carson_Ho单例模式(Singleton)- 最易懂的设计模式解析

上一篇 下一篇

猜你喜欢

热点阅读