java面试突击——单例设计模式

单例模式

保证只有一个实例

定义私有的构造器

定义对外的方法创建

1、饿汉式

在类加载中就创建了对象

缺点:可能会永远用不到,浪费空间。对资源的利用不好。

public class Singleton {

    // 在类加载时就创建实例
    private static final Singleton instance = new Singleton();

    // 私有构造方法,防止外部实例化
    private Singleton() {
    }

    // 全局访问点
    public static Singleton getInstance() {
        return instance;
    }
}

2、懒汉式

用的时候才创建。

可以先声明为空,做if判断后没有对象再创建一个。

public class Singleton {

    // 使用 volatile 保证多线程环境下的可见性和防止指令重排序
    private static volatile Singleton instance;

    private Singleton() {
    }

    // 双重检查锁定
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

但是懒汉式不能解决多线程的问题

所以就出现了双重检测锁

同时,需要在上面声明的instance加上volatile关键字修饰

保证分配空间、成功创建对象并赋值给instance;线程的可见性

此时外部可以通过反射暴力破解

可以在构造方法上加判断,抛异常,中止行为

但是此时还可以用序列化和反序列化的方式破解

这种方式创建对象是和原来的instance是不同的,违背了单例

可以重写readReslove方法

return instance;这样就前后两个对象都相同了。

应用

工厂、bean、池

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值