单例模式--面试

单例模式–面试

目标

  1. 掌握单例模式常见的五种实现方式
  2. 了解jdk中有那些地方体现了单例模式

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


0. 单例模式(Singleton)介绍

概念

指在一个系统中某个类只存在一个实例,类中自行实例化,实例像该系统提供统一的访问接口。

两种表现形式:

  1. 饿汉式:类加载时,就进行实例化;
  2. 懒汉式:第一次引用类才进行实例化。

五种实现方式

应用场景


一、单例模式之饿汉模式

代码

// 1. 饿汉式
public class Singleton1 implements Serializable{
	// 1) 构造私有(构造不是私有的化容易被其他类改变)
    private Singleton1(){
    	System.out.println("private Singleton1");
    }
    // 2) 提供一个静态私有成员变量
    private static final Singleton1 INSTANCE = new Singleton1();
    // 3) 提供一个公共的静态方法,返回私有变量
    public static Singleton1 getInstance(){
    	return INSTANCE;
    }
    // 为了测试是饿汉式还是懒汉式
    public static void otherMethod(){
    	System.out.println("otherMethod");
    }
}

对构造方法进行私有化,可以保证不被外部代码直接实例化。并且由于构造函数私有,该例无法被继承。

实例

需要提前加载单例(Singleton1.otherMethod())

在这里插入图片描述

破坏单例的场景

反射破坏单例

反射破坏单例

如何预防?

// 预防反射破坏
private Singleton1(){
	if(INSTANCE!=null){
		throw new RuntimeEXception("单例对象不能重复创建");
	}
	System.out.println("private Singleton1");
}

反序列化破坏单例

在这里插入图片描述

预防:

// 在进行反序列化破坏单例时(对readResolve()方法进行重写)将自动调用下面的函数,将单例原封不断的返回
public Object readResolve(){
	return INSTANCE;
}

Unsafe破坏单例

在这里插入图片描述

二、单例模式之枚举饿汉式

代码

在这里插入代码片

代码如下(示例):

实例

破坏单例的方式

参考`

  1. 单例模式及其使用场景
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值