所谓类的单例设计模式,就是 某个类在系统前后只能存在一个对象实例。 并且该类只提供一个取得其对象实例的静态方法。
单例设计模式五种方式:
-
1) 饿汉式(静态常量、线程安全)
-
2) 懒汉式(线程安全,同步方法)
构造器私有化 (防止 new ) 、 类的内部创建对象 、向外暴露一个静态的公共方法。getInstance 核心代码:
-
3) 双重检查(推荐使用)
构造器私有化 (防止 new ) 、 类的内部创建对象 、向外暴露一个静态的公共方法。getInstance 核心代码:
volatile可以将线程的工作内存变量实时刷新到主内存中,让其他线程实时看到变量的修改。
优点:线程安全,实现懒加载效果,需要时才实例化该对象。实例代码只执行一次,后面访问直接进入第一个if判断后就返回了,效率比上一个较高。
-
4) 静态内部类(推荐使用)
构造器私有化 (防止 new ) 、 类的内部创建对象 、向外暴露一个静态的公共方法。getInstance 核心代码:
优点:静态内部类在外部类被装载时是不会被装载的,只有在用到的时候才会被装载、被实例化,而且被装载和被实例化只会发生一次,所以利用静态属性,JVM帮我们保证了线程安全,同时也实现了懒加载效果,效率高。推荐使用。
-
5) 枚举(推荐使用)
核心代码:
优点:线程安全,防止反序列化重新创建新的对象。推荐使用。
反序列和反射对枚举不起作用,枚举天生线程安全。
占用资源少,无需懒加载,使用枚举创建单例;
占用资源多,需要懒加载,使用静态内部类创建单例;
1) 单例模式保证了 系统内存中该类只存在一个对象,节省了系统资源, 对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。
2) 当想实例化一个单例类时,必须要记住使用相应的获取对象的方法,而不是使用new。
3) 单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或 耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库 或文件的对象(比如数据源、session工厂等)。
笔者有心,请您留下星星!!!!!!!!!!!!!!!!!!!!!!!!!!