单例模式与多线程

xiaoxiao2021-02-28  84

立即加载/"饿汉模式"

什么是立即加载

立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就是直接new实例化,在调用方法前实例已经被创建了.利用getInstance()获得一个对象.

延迟加载/"懒汉模式"

什么是延迟加载

延迟加载就是在调用get()方法时实例才被创建,常见的实现办法就是在get()方法中进行new实例化,在调用方法时实例才被创建.利用get()获得一个对象.

延迟加载/"懒汉模式"的缺点

在多线程环境中,使用get()方法多次实例化,取得的不是同一个对象,其hashCode不相同.

延迟加载/"懒汉模式"的解决方案

1.声明synchronized关键字

造成错误的原因:多个线程可以同时进入getInstance()方法; 解决办法:对getInstance()方法声明synchronized关键字为同步方法. 此方法缺点:方法运行效率非常低下,方法是同步运行的,下一个线程想要取得对象,则必须等上一个线程释放锁之后才可以继续执行.

2.使用DCL双检查锁机制

双检查锁就是在同步代码块调用之前检查一遍,载再在同步代码块内部再检查一遍。双重保险

使用静态内置类实现单例模式

序列化与反序列化的单例模式实现

使用static代码块实现单例模式

使用enum枚举数据类型实现单例模式

转载请注明原文地址: https://www.6miu.com/read-51991.html

最新回复(0)