饿汉式(线程不安全):
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;
}
}
大家或许已经注意到<code>synchronized</code>关键字,这使得在多线程的情况下保证单例对象的唯一性。这种方式在一定程度上节约了资源,但是第一次加载时需要及时进行实例化,反应稍慢,而且每次调用<code>getInstance()</code>都会进行同步,造成不必要的同步开销,不建议使用。
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方式既实现了需要才初始化单例,又保证了线程安全,且<code>getInstance</code>调用时不立即进行同步锁,避免了不必要的开销。
单例在使用时需要注意:
单例对象如果持有<code>Context</code>,能容易造成内存泄漏,所以在传给单例对象的<code>Context</code>最好是<code>Application Context</code>