Java常见设计模式之单例模式

一、单例模式的特点:

    1.单例模式有且只有一个实例;

    2.单例模式必须自己创建自己的唯一实例;

    3.单例模式必须向其他对象提供这一实例;(对外提供获取唯一实例的方法)

二、单例模式的优点:

    避免实例对象的重复创建,减少创建对象时的时间开销,节约内存空间;

三、常见单例模式写法:

    1.饿汉式

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

    饿汉式顾名思义,每次一用它就直接创建了实例,优点是不存在多线程访问的安全问题,缺点是这个实例在程序生命周期中都一直存在,对于内存资源的占用较高;

    2.懒汉式

public class Singleton{
    private static Singleton st = null;
    private Singleton() {};
    public static Singleton getInstance() {
        if(null == st) {
            st = new Singleton();
        }
        return st;
    }
}

    懒汉式比饿汉式的优点是实现了懒加载,在具体需要的时候才去实例化;

    缺点是线程是不安全的,适用于单线程操作中;

    3.懒汉式(线程安全,同步锁synchronized

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

   优点:既实现了懒加载,又实现了线程安全;

   缺点:性能较低,加锁的方法在被调用时,比一般方法的调用要慢很多,这样写对于性能的损耗较高;

   4.懒汉式(线程安全,双重校验锁)

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

    5.静态内部类

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

    这种方法是内部类里创建实例,但是因为内部类是private私有的,所以只有在调用到私有的内部类的时候,JVM才会去创建实例对象;并且因为写在内部类里,利用了类加载机制,不存在多线程并发的问题;    


    如果需要考虑线程安全问题,推荐使用第4或第5种。

    最后是对自己说的话:单例模式是一种设计思想,很多时候我们很随意的就会new一个对象,而不会去考虑是否需要用单例去实例化,我觉得比掌握几种单例模式写法更重要的是随时考虑性能问题,更多地将单例模式运用到代码中。

猜你喜欢

转载自blog.csdn.net/qq_33236248/article/details/79959835