Java23种设计模式【1】----》单例模式

一、原理

保证一个类只有一个对象,并且提供一个全局的访问点

二、应用场景

三、优点

内存占用小 

四、最好拥有的特点

线程安全,调用效率高,懒加载----》推荐使用静态内部类实现

五、常见的五种单例模式

1、饿汉式

调用频繁推荐饿汉式

优点:采用类加载是类初始化的时候创建的,是天然线程安全的模式。

缺点:但如过没有被调用,就浪费了资源,因为对象已经创建了

测试:

2、懒汉式

优点:当创建类开支大时用这种模式,节约资源

缺点:由于synchronized放在了方法上,所以当线程较多时,都得等待,导致效率低下

3、双重检查锁模式

优点:综合了饿汉式和懒汉式

缺点: 

4、静态内部类实现

优点:线程安全,懒加载,效率高

线程安全:采用了内部类加载,类加载是天然线程安全的;instance 是static final的,表示该实例只能创建一次不能被修改,从而保证了线程的安全

懒加载:静态内部类不会随着类初始化时初始化,只有调用时才初始化

效率高:使用时直接调用,不用等待

5、枚举实现

优点:最简单最好用,天然单例,调用效率高

缺点:无延迟加载

测试:

六、实现方式总结

七、如何选用

不需要延时加载:枚举式好于饿汉式

需要延时加载:静态内部类式好于懒汉式

八、如何防止反射和反序列化漏洞

注:对枚举不起作用,因为枚举式天然的单例

测试懒汉式

1、通过反射的方式直接调用私有构造器

攻击代码:

预防代码:

直接抛出异常,不让new

2、通过反序列化的方式构造多个对象

攻击:

预防:

在类中添加如下方法:

九、测试五种单例模式的效率

使用CountDownLatch类检测

检测结果:

懒汉式效率最低。

 

猜你喜欢

转载自blog.csdn.net/jinhaijing/article/details/83512107