java单例模式代码

在Java中,单例模式用于确保一个类只有一个实例,并提供全局访问点。

java
public class Singleton { // 私有静态变量,用于保存唯一实例 private static Singleton instance; // 私有构造方法,防止外部实例化 private Singleton() { // 初始化操作 } // 公共静态方法,用于获取唯一实例 public static Singleton getInstance() { // 第一次调用时创建实例 if (instance == null) { instance = new Singleton(); } // 返回实例 return instance; } // 可以在这里添加其他方法和属性 public void someMethod() { System.out.println("Some method of the singleton instance."); } }

这是一个经典的懒汉式单例模式实现,它延迟实例化,只在第一次调用getInstance()方法时创建实例。这种实现在多线程环境下可能会有问题,因为多个线程可以同时进入if (instance == null)判断,导致创建多个实例。为了解决这个问题,可以在getInstance()方法上加上synchronized关键字,或者使用双重检查锁定等方式进行改进。

当需要考虑多线程环境时,可以通过

java
public class Singleton { // 使用volatile关键字确保instance对所有线程的可见性 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; } // 可以在这里添加其他方法和属性 public void someMethod() { System.out.println("Some method of the singleton instance."); } }

在这个改进的版本中,通过使用volatile关键字确保了instance对所有线程的可见性。同时,在getInstance()方法中使用双重检查锁定,以减少对锁的竞争,提高性能。这样可以确保在多线程环境下仍然能够保持单例的唯一性。

自Java 5以来,JVM对volatile关键字的语义进行了调整,可以确保双重检查锁定的正确性。在Java 5及更高版本中,这种实现是安全的。