学堂 学堂 学堂公众号手机端

Java单例模式的实现方法有以下几种

lewis 1年前 (2024-04-23) 阅读数 21 #技术

Java单例模式的实现方法有以下几种:

  1. 懒汉式(LazyInitialization): 在第一次使用时才创建实例。线程不安全版本的懒汉式实现如下:
publicclassSingleton{ privatestaticSingletoninstance; privateSingleton(){} publicstaticSingletongetInstance(){ if(instance==null){ instance=newSingleton(); } returninstance; } }

可以通过在getInstance()方法上加锁synchronized来实现线程安全的懒汉式单例模式,但是会影响效率:

publicclassSingleton{ privatestaticSingletoninstance; privateSingleton(){} publicstaticsynchronizedSingletongetInstance(){ if(instance==null){ instance=newSingleton(); } returninstance; } }
  • 饿汉式(EagerInitialization): 在类加载时就创建实例,线程安全。实现如下:
  • publicclassSingleton{ privatestaticSingletoninstance=newSingleton(); privateSingleton(){} publicstaticSingletongetInstance(){ returninstance; } }

    由于在类加载时就创建实例,因此无法实现延迟加载。


  • 双重检查锁定(DoubleCheckedLocking): 在懒汉式的基础上,进行双重检查,确保线程安全且效率较高:
  • publicclassSingleton{ privatevolatilestaticSingletoninstance; privateSingleton(){} publicstaticSingletongetInstance(){ if(instance==null){ synchronized(Singleton.class){ if(instance==null){ instance=newSingleton(); } } } returninstance; } }

    使用volatile修饰instance变量可以保证多线程环境下的可见性和有序性。

  • 静态内部类(StaticInnerClass): 利用类的静态内部类来实现懒汉式的延迟加载和线程安全:
  • publicclassSingleton{ privateSingleton(){} privatestaticclassSingletonHolder{ privatestaticfinalSingletonINSTANCE=newSingleton(); } publicstaticSingletongetInstance(){ returnSingletonHolder.INSTANCE; } }

    静态内部类只有在第一次使用时才会被加载,从而实现了延迟加载。

  • 枚举(Enum): 使用枚举类来实现单例模式,可以保证线程安全和防止反射攻击:
  • publicenumSingleton{ INSTANCE; publicvoiddoSomething(){ //dosomething } }
    版权声明

    本文仅代表作者观点,不代表博信信息网立场。

    热门