一、单例模式的特点:
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一个对象,而不会去考虑是否需要用单例去实例化,我觉得比掌握几种单例模式写法更重要的是随时考虑性能问题,更多地将单例模式运用到代码中。