重庆市建设工程施工安全管理总站,网站建设对应的岗位,五合一建站,wordpress弹窗下载页面单例模式所谓类的单例设计模式#xff0c;就是采取一定的方法保证在整个的软件系统中#xff0c;对某个类只能存在一个对象实例#xff0c;并且该类只提供一个取得其对象实例的方法。单例模式有八种方式#xff1a;饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全…单例模式所谓类的单例设计模式就是采取一定的方法保证在整个的软件系统中对某个类只能存在一个对象实例并且该类只提供一个取得其对象实例的方法。单例模式有八种方式饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全)、懒汉式(线程安全同步方法)、懒汉式(线程安全同步代码块)、双重检查、静态内部类、枚举第一种饿汉式静态常量实现步骤如下构造器私有化防止被new类的内部创建对象向外部暴露一个静态的公共方法getInstanceclass Singleton { // 1.构造器私有化 private Singleton() { // ... } // 2.在本类内部创建对象实例 private final static Singleton instance new Singleton(); // 3.对外提供一个公有的静态方法返回实例对象 public static Singleton getInstance() { return instance; } }优点写法简单在类装载的时候完成实例化避免了线程同步问题缺点在类装载的时候完成实例化没有懒加载的效果。如果未曾使用过这个类会造成内存的浪费第二种饿汉式静态代码块class Singleton { // 1.构造器私有化 private Singleton() { // ... } // 2.在本类内部声明静态对象属性 private static Singleton instance; // 3.使用静态代码块创建对象 static { instance new Singleton(); } // 4.对外提供一个公有的静态方法返回实例对象 public static Singleton getInstance() { return instance; } }优缺点与静态常量一样无非就是把实例化过程放在了静态代码块第三种懒汉式线程不安全class Singleton { private static Singleton instance; private Singleton() {} // 提供一个静态的公有方法当使用到该方法的时才去创建实例 public static Singleton getInstance() { if (instance null) { instance new Singleton(); } return instance; } }优缺点起到了懒加载的效果但是只能在单线程下使用。如果在多线程下使用由于静态获取方法未进行线程安全处理可能会导致产生多个实例因此实际开发中不建议使用第四种懒汉式线程安全同步方法class Singleton { private static Singleton instance; private Singleton() {} // 提供一个静态的公有方法当使用到该方法的时才去创建实例 // 加入了synchronized的同步处理机制解决线程安全问题 public static synchronized Singleton getInstance() { if (instance null) { instance new Singleton(); } return instance; } }优缺点解决了线程不安全问题但是由于同步处理导致效率低其实获取方法只要执行一次就够了因此实际开发中也不建议使用第五种懒汉式线程安全同步代码块class Singleton { private static Singleton instance; private Singleton() {} // 提供一个静态的公有方法当使用到该方法的时才去创建实例 public static Singleton getInstance() { if (instance null) { synchronized (Singleton.class) { instance new Singleton(); } } return instance; } }优缺点这种方法本意为了改进前一种的效率问题但是反而起不到线程同步作用依旧可能有多个线程进到if语句会产生多个实例因此实际开发中不能使用第六种双重检查class Singleton { // 使用轻量级volatile private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance null) { synchronized (Singleton.class) { // 第二次检查防止重复创建实例 if (instance null) { instance new Singleton(); } } } return instance; } }优缺点双重检查有效保证了线程安全同时也避免反复进行方法同步提高效率满足线程安全延迟加载效率高实际开发中推荐使用第七种静态内部类class Singleton { private Singleton() {} // 创建一个静态内部类 private static class SingletonInstance { private static final Singleton INSTANCE new Singleton(); } public static Singleton getInstance(){ return SingletonInstance.INSTANCE; } }优缺点这种方法采用了类装载的机制来保证初始化实例只有一个线程静态内部类方式在Singleton类被装载时并不会立即实例化而是在需要实例化时调用getInstance方法才会装载SingletonInstance类从而完成Singleton的实例化。类的静态属性只会在第一次加载类的时候初始化所以在这里JVM帮助我们保证了线程的安全性因为在类进行初始化时是线程安全的别的线程无法进入。因此避免了线程不安全利用静态内部类特点实现延迟加载效率高。实际开发中推荐使用。第八种枚举enum Singleton { INSTACNE; public void method() { // ... } }优缺点通过枚举来实现单例模式不仅能避免多线程同步问题而且还能防止反序列化重新创建新的对象推荐使用使用单例模式的注意事项单例模式保证了系统内存中该类只存在一个对象节省了系统资源对于一些需要频繁创建销毁的对象使用单例模式可以提高系统性能当想实例化一个单例类的时候必须要记住使用相应的获取对象的方法而不是直接使用new单例模式的使用场景需要频繁创建和销毁对象创建对象时耗时过多或耗费资源过多大对象但又要经常用到的对象工具类对象频繁访问数据库或文件的对象比如数据源、session工厂等