快捷搜索: 王者荣耀 脱发

设计模式解析:单例模式

单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。单例模式通常用于控制某种资源访问的情况下,例如数据库连接池,线程池等等,在这些情况下,我们需要确保全局只有一个实例对象,来更好地协调和管理这些资源。

单例模式的实现可以有多种方法,例如饿汉式、懒汉式和双重检验锁等。下面将通过实际的代码实例来介绍单例模式的实现方法。

饿汉式单例模式

饿汉式单例模式是指在类加载时就创建好一个实例对象,并在需要时直接返回该实例,它的实现非常简单,如下所示:

public class Singleton {
          
   
    // 在类加载时就创建好一个实例对象
    private static final Singleton instance = new Singleton();

    // 将构造方法私有化,外部无法实例化该类
    private Singleton() {
          
   }

    // 提供公共静态方法获取该实例
    public static Singleton getInstance() {
          
   
        return instance;
    }
}

在这个实现中,我们通过将构造方法私有化,使得外部无法实例化该类,然后创建一个私有静态变量 instance,并在类加载时就创建好一个该类的实例对象并赋值给 instance 变量,这样就可以保证整个应用程序中只有一个 Singleton 实例对象。同时,我们提供一个公共的静态方法 getInstance() 来获取该实例。

这种实现方式具有非常好的线程安全性,因为静态变量在类加载时就已经初始化好了,因此不存在线程安全的问题,但是它也存在一些问题,例如不能进行懒加载,也就是说不管是否使用实例对象,都会在类加载时创建,可能会浪费系统资源。

懒汉式单例模式

懒汉式单例模式是指在第一次使用该实例对象时才创建,这种实现方式具有懒加载的特点,可以对系统资源进行更好的协调和调度。下面我们来看一下它的实现代码:

public class Singleton {
          
   
    // 定义变量instance,用于存储实例对象
    private static Singleton instance = null;

    // 将构造方法私有化,外部无法实例化该类
    private Singleton() {
          
   }

    // 提供公共静态方法获取该实例
    public static Singleton getInstance() {
          
   
        // 如果没有实例对象,则创建一个
        if (instance == null) {
          
   
            instance = new Singleton();
        }
        return instance;
    }
}

在这个实现中,我们将 instance 变量定义为一个私有的静态变量,并在公共的静态方法 getInstance() 中使用懒加载的方式来创建实例对象。在方法中通过判断 instance 是否为空来进行创建,这样就可以避免在类加载时就创建实例对象,从而节省系统的资源。

该增加实例对象的代码配置了线程的同步在 getInstance() 方法中,这可以避免当多线程的时候可能因为竞争资源而导致的脏数据和内存一致性问题,从而保证了程序的线程安全性。但是使用 synchronized 关键字的代价是程序的性能会受到影响,在高并发的情况下可能导致阻塞和死锁等问题。

双重检验锁

懒汉式单例模式也有一种线程安全的实现方法,即双重检验锁。下面附上代码:

public class Singleton {
          
   
    private volatile static Singleton instance = null;

    private Singleton() {
          
   }

    public static Singleton getInstance() {
          
   
        if (instance == null) {
          
   
            synchronized (Singleton.class) {
          
   
                if (instance == null) {
          
   
                    instance = new Singleton();
                }
            }
        }
        return instance
经验分享 程序员 微信小程序 职场和发展