单列模式:为了是资源能够共享,只需要赋值和初始化一次大家都能使用
平常哪些用到了单列:监听器本身,日历Calender,IOC容器,配置信息Config....
实现方式:饿汉式,懒汉式,注册登记式(枚举式)、
饿汉式:类加载的时候就立即初始化,并且创建单列对象。
优点:没有加任何锁,执行效率高,线程绝对安全,用户体验上比懒汉式要好
缺点:类加载的时候就初始化,不管你用还是不用都会创建对象,浪费了空间
懒汉式:在外部需要使用的时候才初始化实例
优点:节省内存空间,在需要的时候才产生实例
缺点:线程不安全
为了解决线程不安全我们可以在懒汉式中加锁,但是加锁后严重影响执行效率。
对比加锁后的执行时间:
没加锁执行的时间
加锁后的执行时间:
可以看出效率相差上百倍(数据上万的情况下)。
为了解决加锁后执行效率过低,有种史上最强单列的写法:运用内部类
这种方式兼顾了饿汉式的内存浪费,也兼顾synchronized性能问题
注册时登记
防止反序列化破坏单列