常见的单例模式

饿汉式(线程不安全):

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

懒汉式:
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }

大家或许已经注意到synchronized关键字,这使得在多线程的情况下保证单例对象的唯一性。这种方式在一定程度上节约了资源,但是第一次加载时需要及时进行实例化,反应稍慢,而且每次调用getInstance()都会进行同步,造成不必要的同步开销,不建议使用。
DCL方式实现单例(推荐)
public class Singleton { private static Singleton instance = null; private Singleton(){} public static Singleton getInstance() { if(instance == null) { synchronized(Singleton.class) { if(instance == null) { instance = new Singleton(); } } } return instance; } }

DCL方式既实现了需要才初始化单例,又保证了线程安全,且getInstance调用时不立即进行同步锁,避免了不必要的开销。
【常见的单例模式】单例在使用时需要注意:
单例对象如果持有Context,能容易造成内存泄漏,所以在传给单例对象的Context最好是Application Context

    推荐阅读