Java多线程下单例模式实现:Lock与Synchronized对比

阿麦
阿麦
发布时间:2026-10-13 | 4人浏览过
原创

在高并发环境中实现Java懒汉式单例模式时,必须解决多线程同时调用 getInstance 方法导致创建多个实例的问题。本文通过 ReentrantLock 显式锁定和 synchronized 关键字两种常见方式,解析其代码结构与优缺点,确保系统状态稳定。

高并发环境下的单例挑战

单例模式旨在确保一个类只有一个实例。在多线程并发访问并调用 getInstance 方法时,如果不加控制,可能产生多个实例对象。因此,加锁机制是必要的,以保证线程安全。

使用 ReentrantLock 的解决方案

java.util.concurrent.locks.Lock 提供了比内置锁更灵活的同步功能。使用 ReentrantLock 设定显式锁是处理复杂并发条件的良好解决方案,能够避免在抛出异常时无法维护系统状态的风险。

第1步:定义类结构与静态锁

首先需要创建一个不可继承的单例类,声明静态实例变量和一个 ReentrantLock 对象。私有构造函数防止外部直接实例化。

package demo;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public final class SingletonContext {
    private static SingletonContext sc = null;
    private static Lock lock = new ReentrantLock();
    
    private SingletonContext() {
        // 私有构造
    }

第2步:实现双重检查锁定逻辑

在获取实例的方法中,首先进行非锁定的空值检查以提高性能。若实例为空,则获取锁并进行第二次检查,随后实例化对象。务必在 finally 块中释放锁,以防死锁或资源泄漏。

    public static SingletonContext getInstance() {
        if (sc == null) {
            lock.lock();
            try {
                if (sc == null) {
                    sc = new SingletonContext();
                }
            } finally {
                lock.unlock();
            }
        }
        return sc;
    }
}

使用 synchronized 的关键字方案

除了显式锁,使用 synchronized 也是较为常见的解决方案。其优点在于代码简洁直观,直接在方法签名上声明同步,无需手动管理锁的获取与释放。

第3步:编写同步方法

将 getInstance 方法标记为 static synchronized,确保同一时刻只有一个线程能执行该方法内部的初始化逻辑。

package demo;

public final class SingletonContext {
    private static SingletonContext sc = null;
    
    private SingletonContext() {
    }

    public static synchronized SingletonContext getInstance() {
        if (null == sc) {
            sc = new SingletonContext();
        }
        return sc;
    }
}

以上就是Java多线程下单例模式的详细内容,更多关于Java并发编程与单例实现技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表