首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 单例与双例模式实现:饿汉/懒汉/枚举/双重检查锁、双例随机分发

     編輯:Java 綜合教學

Java 单例与双例模式实现

单例模式确保全局唯一实例;双例模式(罕见)维护固定数量(2)的实例池,按需随机分发。本文给出生产级单例四种写法、双例实现、线程安全分析、适用场景。

单例模式四大写法

模式代码骨架优点缺点
饿汉式private static final Instance INSTANCE = new Instance();类加载时创建,天然线程安全,无锁开销类加载即占内存,无法延迟
懒汉式(同步方法)synchronized static getInstance() { if (null) new ... }延迟加载每次获取加锁,性能差
双重检查锁 (DCL)volatile Instance; if (null) synchronized { if (null) new }延迟 + 高性能需 volatile 禁止指令重排,JDK 5+ 有效
静态内部类static class Holder { static final Instance INSTANCE = new Instance(); }延迟 + 线程安全 + 简洁无明显缺点,**推荐**
枚举单例enum Instance { INSTANCE; }防反射/序列化破坏,最简洁无法延迟加载(枚举类加载即实例化)

双例模式实现

public class Doubleton {
    private static final List POOL = new ArrayList<>();
    private static final int SIZE = 2;
    private static final Random RANDOM = new Random();

    static {
        for (int i = 0; i < SIZE; i++) POOL.add(new Doubleton());
    }

    private Doubleton() {}

    public static Doubleton getInstance() {
        return POOL.get(RANDOM.nextInt(SIZE)); // 随机分发
    }

    public String getValue(String name) { return name; }
}

关键点解析

  • 固定池大小:静态块预创建 SIZE 个实例,生命周期随类加载
  • 随机分发:Random.nextInt(SIZE) 实现简单负载均衡
  • 线程安全:静态初始化由 JVM 保证;Random 为线程安全类
  • 扩展性:SIZE 可配置化为三例、N 例;分发策略可替换为轮询、加权

适用场景对比

避坑提示

  1. 单例必须**私有构造器**、**静态工厂方法**、**防反射/序列化破坏**(枚举最强)
  2. 双例池对象若有状态,需确保线程安全或使用 ThreadLocal 隔离
  3. 随机分发可能导致实例负载不均,高并发建议改用原子计数器轮询
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
模式典型场景
单例配置管理器、连接池、线程池、日志工厂、全局缓存
双例/多例有限资源池(数据库连接、大对象缓存)、A/B 测试固定版本轮询、许可证限制实例数