JAVA中的单例模式

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在JAVA中,单例模式被广泛使用,因为它可以控制对象的创建和访问,从而确保系统的稳定性和一致性。

实现方式

在JAVA中,有多种方式可以实现单例模式,其中最常用的方式包括:

  1. 饿汉式:在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}
  1. 懒汉式:类加载速度快,但运行时获取对象的速度慢,且多线程环境下可能不安全。

public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  1. 双重校验锁:既保证了线程安全,又提高了执行效率。

public class Singleton {
    private volatile static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
  1. 静态内部类:利用了classloader的机制来保证初始化instance时只有一个线程,且JVM内部已经做了同步处理。

public class Singleton {
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    private Singleton (){}
    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}
  1. 枚举:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。这是Effective Java推荐的方式。

public enum Singleton {
    INSTANCE;
    public void whateverMethod() { }
}

使用场景和注意事项

单例模式的使用场景主要包括:需要频繁创建和销毁的对象、创建对象时耗时过多或耗费资源过多、但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象等。然而,过度使用单例模式可能导致系统结构不清晰,增加代码的耦合度,不利于单元测试等。因此,在使用单例模式时需要注意适度使用,并考虑其对系统结构和可维护性的影响。