📜  java 单例 - Java (1)

📅  最后修改于: 2023-12-03 15:15:59.498000             🧑  作者: Mango

Java 单例

在 Java 编程中,单例是一种经常使用的设计模式,它可以确保一个类在任何情况下只有一个实例,并且提供一个访问该实例的全局访问点。

实现单例模式的方法
饿汉模式

饿汉模式是指在程序启动时就创建单例对象。这种实现方式简单直观,但如果单例对象过于复杂,或者创建很耗时的话,会导致程序启动变慢,甚至影响程序的响应时间。

public class Singleton {
    private static final Singleton instance = new Singleton();
    
    private Singleton() {
    }
    
    public static Singleton getInstance() {
        return instance;
    }
}
懒汉模式

懒汉模式是指在第一次使用单例对象时才创建它。这种实现方式可以避免饿汉模式的缺点,但是在多线程环境下需要考虑并发访问的问题。为了避免线程安全问题,可以加锁或使用静态内部类等方式。

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;
    }
}
使用枚举

枚举是一种特殊的类,可以确保在任何情况下只创建一个枚举对象,因此可以用来实现单例。

public enum Singleton {
    INSTANCE;
    
    public void doSomething() {
        // do something
    }
}
单例的优缺点
优点
  • 确保一个类一次只有一个实例,并提供一个全局访问点,方便对该实例进行操作和管理。
  • 提供了对唯一实例的受控访问,避免了因多个对象对同一数据碰撞而导致的不一致状态。
缺点
  • 单例模式可能对单元测试造成影响,因为它并不是很容易进行模拟和模仿。
  • 单例对象在应用程序的整个生命周期内都存在于内存中,会占用一定的系统资源。
  • 单例对象被多个线程同时访问时需要考虑线程安全问题,增加了开发和调试难度。
总结

单例模式是一种非常常用的设计模式,在 Java 开发中经常会用到。不同的实现方式各有优缺点,开发者需要根据具体的场景选择合适的实现方式。在多线程环境下使用单例模式需要注意线程安全问题,避免出现因并发访问而导致的不一致状态。