单例模式(Singleton Pattern)是一种常用的软件设计模式,其目的是确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。在Java中,实现单例模式有多种方式,但主要可以归纳为以下几种:

1. 懒汉式(线程不安全)

这是最基本的实现方式,但是它在多线程环境下是不安全的。

java复制代码
 public class Singleton {  
 
     private static Singleton instance;  
 
   
 
     private Singleton() {}  
 
   
 
     public static Singleton getInstance() {  
 
         if (instance == null) {  
 
             instance = new Singleton();  
 
         }  
 
         return instance;  
 
     }  
 
 }

2. 懒汉式(线程安全)

通过在getInstance()方法上添加synchronized关键字,使其在多线程环境下安全,但效率较低。

java复制代码
 public class Singleton {  
 
     private static Singleton instance;  
 
   
 
     private Singleton() {}  
 
   
 
     public static synchronized Singleton getInstance() {  
 
         if (instance == null) {  
 
             instance = new Singleton();  
 
         }  
 
         return instance;  
 
     }  
 
 }

3. 双重检查锁定(Double-Checked Locking)

这种方式既保证了线程安全,又比单纯的同步方法效率要高。

java复制代码
 public class Singleton {  
 
     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;  
 
     }  
 
 }

注意,这里instance变量被声明为volatile,这是为了防止指令重排序。

4. 静态内部类

这种方式利用了classloder的机制来保证初始化instance时只有一个线程,既实现了线程安全,又避免了同步带来的性能影响。

java复制代码
 public class Singleton {  
 
     private Singleton() {}  
 
   
 
     private static class SingletonHolder {  
 
         private static final Singleton INSTANCE = new Singleton();  
 
     }  
 
   
 
     public static final Singleton getInstance() {  
 
         return SingletonHolder.INSTANCE;  
 
     }  
 
 }

5. 枚举

这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化,即使在面对复杂的序列化或者反射的时候,这种实现方式仍然有效。

java复制代码
 public enum Singleton {  
 
     INSTANCE;  
 
   
 
     public void whateverMethod() {  
 
     }  
 
 }

总结

  • 懒汉式(线程不安全)和懒汉式(线程安全)实现简单,但前者在多线程环境下不安全,后者虽然安全但效率较低。
  • 双重检查锁定方式既保证了线程安全,又提高了效率,但实现较为复杂。
  • 静态内部类方式利用了classloder机制,既实现了线程安全,又避免了同步的开销。
  • 枚举方式是实现单例模式的最佳方法,它更简洁,更安全。