单例模式的多种实现

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;
}

但枚举不会有这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值