基于改进YOLOv5的人群密度检测:FasterNet主干与Soft-NMS优化实践
2026/9/23 9:56:58
单例:保证一个类在整个应用中只有一个实例对象,提供全局访问点。
publicclassSingleton{// 类加载直接初始化实例privatestaticfinalSingletonINSTANCE=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}}publicclassSingleton{privatestaticSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){instance=newSingleton();}returninstance;}}publicstaticsynchronizedSingletongetInstance(){if(instance==null){instance=newSingleton();}returninstance;}getInstance都要获取锁,高并发性能很低publicclassSingleton{// 必须加volatile,防止指令重排privatestaticvolatileSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){// 第一次判断:不为空直接返回,减少锁竞争if(instance==null){synchronized(Singleton.class){// 第二次判断:防止多个线程等待锁后重复创建if(instance==null){instance=newSingleton();}}}returninstance;}}volatile作用:禁止new Singleton()指令重排。new对象分三步:分配内存→初始化对象→赋值引用;不加volatile可能先赋值再初始化,其他线程拿到半初始化对象。
publicclassSingleton{privateSingleton(){}// 静态内部类,只有调用getInstance才会加载privatestaticclassSingletonHolder{privatestaticfinalSingletonINSTANCE=newSingleton();}publicstaticSingletongetInstance(){returnSingletonHolder.INSTANCE;}}SingletonHolder才初始化实例publicenumSingletonEnum{INSTANCE;//业务方法publicvoiddoSomething(){}}synchronized方法锁,性能差。synchronized+volatile,既要锁,又要禁止指令重排。注意点:
- 反射可以暴力调用私有构造器破坏单例;枚举天然规避这个问题。
- 序列化/反序列化也会破坏普通单例,枚举同样天然解决。