常见的单例模式
饿汉式(线程不安全):
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
推荐阅读
- 素描学习(学习素描、速写的经验)
- 【谋杀系列】【さいこ的妄想症】
- 雪花带来冬天的梦
- 你
- 新品团购预热|给孩子最好的英语启蒙礼物(双语绘本+小达人点读笔)
- 45天的创客孵化营收获总结
- 你所有的疑虑都是你不懂自己
- 诗经抄写215〔小雅·小弁·前〕
- 道不明的第一场艳遇
- 【晨间日记第15天】2016年买房的收获和感悟