Java 单例模式详解

39 阅读2分钟

Java 单例模式详解

引言

在软件设计中,单例模式(Singleton Pattern)是一种常用的设计模式,它确保一个类只有一个实例,并提供全局访问点。本文将介绍四种常见的单例模式实现方式,包括懒汉式(线程不安全)、饿汉式、懒汉式(简单同步方法)和双重检查锁定(Double-Checked Locking)。

懒汉式(线程不安全)

懒汉式单例模式在第一次调用 getInstance 方法时实例化对象。这种实现方式在单线程环境下没有问题,但在多线程环境中存在线程安全问题,可能会导致多个实例的创建。

package com.zsn.singleDemo;
​
/**
 * @Author: zsn
 * @Date: 2024/7/5 10:54
 * @Description: 懒汉式(线程不安全)
 * @Version: 1.0
 */
public class SingleDemo1 {
​
    private static SingleDemo1 singleDemo1;
​
    private SingleDemo1() {
    }
​
    public static SingleDemo1 getInstance() {
        if (singleDemo1 == null) {
            singleDemo1 = new SingleDemo1();
        }
        return singleDemo1;
    }
}

饿汉式

饿汉式单例模式在类加载时就创建实例,线程安全,但如果实例初始化开销大且在实际使用中可能不会被用到,会导致资源浪费。

package com.zsn.singleDemo;
​
/**
 * @Author: zsn
 * @Date: 2024/7/5 10:56
 * @Description: 饿汉式
 * @Version: 1.0
 */
public class SingleDemo2 {
    private static SingleDemo2 singleDemo2 = new SingleDemo2();
​
    private SingleDemo2() {
    }
​
    public static SingleDemo2 getSingleDemo2() {
        return singleDemo2;
    }
}

懒汉式(加一个锁 - 简单同步方法)

通过在 getInstance 方法上添加 synchronized 关键字,确保线程安全,但每次调用 getInstance 方法时都会进行同步,影响性能。

package com.zsn.singleDemo;
​
/**
 * @Author: zsn
 * @Date: 2024/7/5 11:09
 * @Description: 懒汉式(加一个锁 - 简单同步方法)
 * @Version: 1.0
 */
public class SingletonLazySimpleSync {
    private static SingletonLazySimpleSync instance;
​
    private SingletonLazySimpleSync() {
    }
​
    public static synchronized SingletonLazySimpleSync getInstance() {
        if (instance == null) {
            instance = new SingletonLazySimpleSync();
        }
        return instance;
    }
}

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

双重检查锁定在保持延迟初始化的同时确保线程安全,并且在实例已经初始化的情况下避免了同步开销,是一种优化的单例实现方式。

package com.zsn.singleDemo;
​
/**
 * @Author: zsn
 * @Date: 2024/7/5 11:14
 * @Description: 双重检查锁定
 * @Version: 1.0
 */
public class SingletonLazyDoubleCheck {
​
    private static volatile SingletonLazyDoubleCheck singletonLazyDoubleCheck;
​
    private SingletonLazyDoubleCheck() {
    }
​
    public static SingletonLazyDoubleCheck getInstance() {
        if (singletonLazyDoubleCheck == null) {
            synchronized (SingletonLazyDoubleCheck.class) {
                if (singletonLazyDoubleCheck == null) {
                    singletonLazyDoubleCheck = new SingletonLazyDoubleCheck();
                }
            }
        }
        return singletonLazyDoubleCheck;
    }
}

总结

单例模式是一种简单而强大的设计模式,适用于需要全局唯一实例的场景。不同的实现方式各有优劣,需要根据实际需求进行选择:

  • 懒汉式(线程不安全) :适用于单线程环境。
  • 饿汉式:适用于需要快速响应且资源消耗不高的实例。
  • 懒汉式(加一个锁 - 简单同步方法) :适用于多线程环境,但性能开销较大。
  • 双重检查锁定:兼顾延迟初始化和性能,是多线程环境下的推荐实现方式。

选择适合的单例模式实现方式,能够在保证程序正确性的同时提高性能。希望本文能够帮助您更好地理解和应用单例模式。