单例模式
单例模式是一种设计模式
在类中限制代码只允许创建一个实例
饿汉模式(属于线程安全的)
在类中创建一个私有的实例,instance是这个单例类的静态变量,用来保存类的唯一实例

这个类的实例只可以通过调用getinstance拿到这个唯一的实例,
而创建这个空的私有构造方法是为了防止外部实例化这个类
不管你创建多少个这个类的对象其实都是同一个

懒汉模式(有线程安全问题)
懒汉模式的特点是为了节省资源,延迟加载,
因为线程调度执行是随机的,在多线程代码中可能会有多个线程同时进行if判断,这就导致会创建出多个实例

在多线程环境下为了避免线程安全,我们可以在if判断时加锁这样就不会有线程安全问题,当多个线程进行调用getinstance时都需要进行加锁,此时我们的效率就会降低

为了解决效率和线程安全的问题,通过双重检查锁定,在锁的外层再增添一个if来进行检查是否是第一次创建实例,只有第一次创建才会进行加锁,如果不是第一次则直接返回instance

当首次调用getinstance时,线程A执行到了instance = new Singlen()时,jvm进行了重排序,先进行了赋值,未进行初始化,此时cpu进行了资源调度线程B拿到的成员变量处于半初始化状态,导致成员变量的值为默认值,而线程B这时又继续执行判断后直接返回了instance ,当我们继续使用instance里面的属性或者方法,就有可能会引起代码的逻辑性问题,
为了避免jvm进行重排序,在创建类的成员变量时添加volatile,就可以防止行指令重排序和保证内存可见性

饿汉模式和懒汉模式的区别
1.初始化时的区别,饿汉模式是类加载时,懒汉模式是第一次调用getinstance
2.线程安全,饿汉模式是天然的线程安全,而 懒汉模式是需要额外添加同步机制
3.资源的占用,饿汉模式是有可能会造成资源的浪费,而懒汉模式是在需要时才进行加载
4.实现的复杂度,饿汉模式是相对来说比较简单的,而懒汉模式是比较复杂的需要处理线程安全的问题
                    
                
                
            
        
浙公网安备 33010602011771号