单例设计模式及懒汉式线程安全问题

1.介绍

单例(singleton)设计模式:单态、原子设计模式。

单例设计模式作用:

    它主要用来保证一个类在程序从启动到最后结束,要保证这个类的对象只有一个。单例就是保证一个类的对象是唯一的。

生活中的场景:

    比如:A和B2个人去奶茶店买奶茶,老板在给A做奶茶时,B只能等待。只有给A做完奶茶后才能给B做奶茶。

结论:

    单例设计模式解决就对象在堆内中只能开辟一个空间。

//饿汉式
class Singleton (){
    //私有化构造
    private Singleton(){};
    //持有自身对象
    private static Singleton s = new Singleton();
    //对外提供方法
    public Singleton getInstance(){
        return s;
    }
}
//懒汉式
class Singleton2 (){
    //私有化构造
    private Singleton2(){};
    //持有自身对象
    private static Singleton2 s2 = null;
    //对外提供方法
    public Singleton2 getInstance(){
        if(s2 == null){
            s2 = new Singleton2();
        }
        return s2;
    }
}

懒汉式线程安全问题:

// 懒汉式:
class Singleton2 {
	// 私有化构造
	private Singleton2() {};
	// 持有自身对象
	private static Singleton2 s = null;
	// 对外提供方法,获取对象
	public static Singleton2 getInstance() {// t1 // t2
		// 我在外面再加一次判断,那么除了第一次创建对象时会进入并且判断同步。
		//接下来,再来更多线程,都不会进入if块。就不判断同步了,效率提高了。
		if (s == null) {
			// 加synchronized是为了第一次创建对象时线程安全。但是接下来,就不存在线程安全问题。还要判断同步效率低。
			synchronized (Singleton2.class) {
				if (s == null) {
					s = new Singleton2();
				}
			}
		}
		return s;
	}
}

 

转载于:https://my.oschina.net/cs520/blog/900189

你可能感兴趣的:(设计模式)