单例模式
概念简介
单例模式确保某一个类只有一个实例,而且自行实例化像整个系统提供这个实例。
特点
1.单例类只能有一个实例
2.单例类只能自己创建自己的唯一实例,所以需重写这个类的构造方法,并private
3.必须给其他所有对象提供这个实例,所以需要有public的返回该实例的静态方法
饿汉式
只要使用这个类,就创建出单例
懒汉式
只有当单例类用到时才会去创建这个单例类
懒汉式虽然显然看起来更加合理,因为它不浪费资源,但是它是非线程安全的。原因是当cpu分片时,线程A恰好走完静态调用方法非空判断,这时切换到了线程B,B线程顺利走完全程new 了一个NotHungry实例,此时再切换到线程A,A由于已经走过了非空判断所以再次new了一个NotHungry实例,这样NotHungry类在内存中就存在了两份引用
既然线程不安全,那么我们给他加锁不就好了吗。
最简单的给getInstance方法加同步锁
想想这样确实解决了线程不安全的问题,但是不够好,给方法整体加锁性能较差,我们可以只给方法的一部分加锁
使用DCL(Double Check Lock)双检锁机制继续优化
DCL:简单来说就是使用双重判断避免单向排队
只有instance==null时才加锁
使用静态内部类解决这个问题(推荐)
这样既实现了线程安全又避免了同步带来的性能问题