理论
- 只有单个实例存在,现在都由spring工厂默认实现了很少手写了
管理器类manager
工厂类factroy - 保证在内存中有1个实例
- 8种写法
- 构造方法设置成私有的,别人new不了,只能通过instens
应用
饿汉式,
线程安全:class加载到内存就初始化了;
问题:用不用都会初始化
懒汉式
类初始化到内存不初始化,调用getInstance()为null在初始化
问题:多线程访问会有影响,第一个调用get判断为null这时候另外一个线程来了也判断为null,已经有了2个实例
- 同一个类的同一个对象hash是不同的
加锁是在static上,所以是在类上
效率降低了
提高效率,加锁到方法上 线程不安全
线程不安全,因为判断和创建不在一起
双层判断,最完美的写法
如果JIT优化成本地代码,就会交给C处理了。会指令重排不加volatile没初始化就返回instence;
完美
类初始化不会加载内部类,只有调用getInstance()才会创建内部类,是jvm保证线程安全的,相同的内部类之创建1次,
完美中完美 枚举单例
防止线程同步、 防止反序列化(枚举类无构造方法)