1.饿汉模式
public class Car {
//饿汉模式
private static final Car instance = new Car();
//私有化构造函数
private Car() {
}
public static Car getInstance() {
return instance;
}
}
优点:实现简单 缺点:类加载时就创建了对象,占用资源。
2.(同步法)懒汉模式
public class Car {
//懒汉模式
private static Car instance;
//私有化构造函数
private Car() {
}
//同步方法
public synchronized static Car getInstance() {
if (instance == null) {
instance = new Car();
}
return instance;
}
}
优点:单例只有在使用时才会被实例化 缺点:getInstance()为同步方法,每次调用会增加同步开销。
3.DCL单例
public class Car {
//DCL单例(Double Check Lock)
private static Car instance;
//私有化构造函数
private Car() {
}
public static Car getInstance() {
if (instance == null) {
synchronized (Car.class) {
if (instance == null) {
instance = new Car();
}
}
}
return instance;
}
}
优点:懒汉模式的优化版,尽量减少同步开销 缺点:可能发生双重检查锁定失效,概率极小。
4.静态内部类单例模式
public class Car {
//私有化构造函数
private Car() {
}
public static Car getInstance() {
return SingletonHolder.sInstance;
}
private static class SingletonHolder {
private static final Car sInstance = new Car();
}
}
优点:饿汉模式的优化版,car类文件被加载时不会立即初始化单例对象,只有当getInstance()被调用时虚拟机加载SingletonHolder 类才会导致单例对象被初始化。
5.枚举单例
public enum Car {
INSTANCE;
public void work() {
//do something here!
}
}
优点:1.写法简单 2.前面四种实现方式都存在同一个问题:单例对象被序列化后,通过默认的反序列化操作仍然会重新创建对象,解决办法是加入如下方法:
private Object readResolve(){
return instance;
}
但枚举不会有这个问题。