单例模式概念:
确保一个类只有一个实例化对象,并且提供一个可以被全局访问的对象(被共享)
单例模式应用场景:
不希望频繁的创建和销毁对象,带来系统资源的浪费,比如数据库对象或者单例的bean
实现步骤:
1.设置静态成员变量
2.构造器私有化,不让外部创建实例
3.提供静态getter方法,外部获取唯一实例
单例模式常见的有懒汉式单例模式和饿汉式单例模式
懒汉式单例模式也叫延迟加载,就是在调用getter方法的时候创建单例,但是在多线程的条件下会出现线程不安全的问题
有两种方式解决
1.使用synchronized修饰getter方法保证线程同步
2.懒加载使用线程同步会造成性能下降,因为我们只是希望在第一次创建实例的时候加锁
所以就使用了volatile修饰成员变量为线程可见,然后使用双重机制进行两次判空
第一次判空是提高性能,为空的前提下才加锁,第二次判空是为了保证只创建一个实例,保证线程同步
既提高了性能,也保证了线程安全
饿汉式单例模式实在静态成员变量使命的时候创建实例,不会造成线程不安全的问题
为什么要加volatile关键字?
加volatile,设置变量为线程可见,通过变量动态管理线程,减少性能损耗
volatile具有可见性、有序性,不具备原子性