单例模式:简单来说就是一个类只能构建一个对象实例的设计模式。
什么情况下适用单例模式?
1. 频繁实例化然后销毁的情况
2. 频繁访问IO资源如对数据库的连接池
3. 创建耗时长但又经常访问的对象。
单例模式有哪几种实现方式?
1. 静态内部类实现:定义一个 静态内部类,在里面创建该类的实例对象。 外部无法访问这个静态内部类,只能通过调用 类中的静态方法来得到该单例对 象。
线程安全的。用时才加载该类
2. 饿汉模式:直接在类体中就创建实例对象,通过调用类中的静态方法来获取该实例
JVM层面的线程安全,造成了空间了浪费,不用判断就创建实例,如果不用这个实例就浪费了。
3. 懒汉模式:真正需要的时候再创建 先创建一个引用指向null, 再在静态方法中是判断该引用是否为空,空的话创建类的实例,并将该引用指向该实例。
线程不安全,节省空间
4. 双重检查模式:是在线程安全懒汉模式下改进的, 用 volatile关键字修饰 引用,再在静态方法中 synchronize锁住 类的class对象 再判断为空 再创建对象
线程安全, 但指令重排了
5,枚举