在项目中 有些时候有的对象只需要一个,比方说:线程池(ThreadPool),缓存(cache),对话框,处理偏好设置和注册表的对象,日志对象,充当打印机,显卡等设备对驱动程序对象。事实上这些类对象只能有一个实例,如果制造出多个实例就会导致许多问题产生。在安卓中很多系统服务也是使用的单例模式(譬如InputManager),如果不是单例模式其使用过程中必定会产生很多麻烦。
下面我用代码介绍下单例模式:
首先是比较经典的单例模式
public class Singleton { private static Singleton singleton; private int i = 0; private Singleton() { System.out.println(i++); } public static Singleton getInstance() { if (singleton == null) { singleton = new Singleton(); } return singleton; } }
public class Test { public static void main(String[] args) { Singleton singleton = Singleton.getInstance(); Singleton singleton1 = Singleton.getInstance(); Singleton singleton3 = Singleton.getInstance(); } }
public class Singleton { private static Singleton singleton = null; private int i = 0; private Singleton() { System.out.println(i++); } public static synchronized Singleton getInstance(){ if (singleton == null) { singleton = new Singleton(); } return singleton; } }
但这样需要多次获取单例时,多线程时也会有延迟,所以我介绍另外一种单例模式:饿汉式
public class Singleton { private static Singleton singleton = new Singleton(); private int i = 0; private Singleton() { System.out.println(i++); } public static Singleton getInstance(){ return singleton; } }也就是说在类进行初始化时就创建单件。
下面这种使用了双重检查加锁,这样使同步只有在第一次创建单例才会进行,其中volatile关键字可以保证singleton多线程时实时更新。(其具体详解:http://www.cnblogs.com/dolphin0520/p/3920373.html)
public class Singleton { private volatile static Singleton singleton; private int i = 0; private Singleton() { System.out.println(i++); } public static Singleton getInstance(){ if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }