一、原理
保证一个类只有一个对象,并且提供一个全局的访问点
二、应用场景
三、优点
内存占用小
四、最好拥有的特点
线程安全,调用效率高,懒加载----》推荐使用静态内部类实现
五、常见的五种单例模式
1、饿汉式
调用频繁推荐饿汉式
优点:采用类加载是类初始化的时候创建的,是天然线程安全的模式。
缺点:但如过没有被调用,就浪费了资源,因为对象已经创建了
测试:
2、懒汉式
优点:当创建类开支大时用这种模式,节约资源
缺点:由于synchronized放在了方法上,所以当线程较多时,都得等待,导致效率低下
3、双重检查锁模式
优点:综合了饿汉式和懒汉式
缺点:
4、静态内部类实现
优点:线程安全,懒加载,效率高
线程安全:采用了内部类加载,类加载是天然线程安全的;instance 是static final的,表示该实例只能创建一次不能被修改,从而保证了线程的安全
懒加载:静态内部类不会随着类初始化时初始化,只有调用时才初始化
效率高:使用时直接调用,不用等待
5、枚举实现
优点:最简单最好用,天然单例,调用效率高
缺点:无延迟加载
测试:
六、实现方式总结
七、如何选用
不需要延时加载:枚举式好于饿汉式
需要延时加载:静态内部类式好于懒汉式
八、如何防止反射和反序列化漏洞
注:对枚举不起作用,因为枚举式天然的单例
测试懒汉式
1、通过反射的方式直接调用私有构造器
攻击代码:
预防代码:
直接抛出异常,不让new
2、通过反序列化的方式构造多个对象
攻击:
预防:
在类中添加如下方法:
九、测试五种单例模式的效率
使用CountDownLatch类检测
检测结果:
懒汉式效率最低。