转自:https://blog.csdn.net/u011386173/article/details/82454714
1.饿汉式
(1)饿汉式
提前(类加载时)创建
- 优点:确保单例;
- 缺点:单例永远不用时浪费内存
- 常见方式
public class Singleton {
private static Singleton instance=new Singleton();
private Singleton(){}//非私有构造器无法保证单例
public static Singleton getInstance(){
return instance;
}
}
(2)饿汉式变体
public class Singleton {
private static Singleton instance=null;
static {
instance=new Singleton();
}
private Singleton(){}//非私有构造器无法保证单例
public static Singleton getInstance(){
return instance;
}
}
2.懒汉式
(1)懒汉式(非线程安全)
- 优点:需要时创建;
- 缺点:多线程时并发调用getInstance,可能创建多个实例;
- 不推荐
public class Singleton {
private static Singleton instance=null;
private Singleton(){}//非私有构造器无法保证单例
public static Singleton getInstance(){
if(instance==null) {
instance=new Singleton();
}
return instance;
}
}
(2)懒汉式(线程安全)
- 优点:需要时创建;
- 缺点:多线程时需要等待,效率低
- 不推荐
public class Singleton {
private static Singleton instance=null;
private Singleton(){}//非私有构造器无法保证单例
public static synchronized Singleton getInstance(){
if(instance==null) {
instance=new Singleton();
}
return instance;
}
}
3.静态内部类
类似于饿汉式
public class Singleton {
private Singleton(){}//非私有构造器无法保证单例
private static class SingletonHolder {
private static Singleton instance=new Singleton();
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
4.双重检查加锁
属于懒汉式
- 优点:线程安全,保证单例,效率高;需要时创建;
- 推荐使用
public class Singleton {
private volatile static Singleton instance;//volatile作用禁止指令重排
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){//只有第一会同步,保证效率
synchronized (Singleton.class){//同步锁
if(instance==null){//保证单例
instance=new Singleton();
}
}
}
return instance;
}
}
5.枚举
- 优点:代码简单,支持序列化
- 缺点:不能需要时创建(懒加载)
public enum Singleton {
INSTANCE;
public void whateverMethod(){
}
}
最后借用 《Effective Java》一书中的话:
单元素的枚举类型已经成为实现Singleton的最佳方法.
单例模式在Android使用场景:
xxxManager , xxxHelper , xxxUtils