设计模式之单例模式

单例模式确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例
单例模式的主要作用是确保一个类只有一个实例存在

使用场景:
● 作为序列号生成器
● Web页面的计数器,避免每次刷新都在数据库中增加技术,先缓存起来
● 创建消耗资源过多的对象,如I/O与数据库连接等

单例模式存在7种实现方法
主要分为饿汉式和懒汉式
饿汉式:类加载就会导致该单实例对象被创建
懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时才会创建。

这里示范实现单例模式的最佳方法:以枚举的方式来实现单例模式并使用(实现序列号生成器)

public enum SequenceGenerator {
    INSTANCE;

    private int sequenceNumber;

    // 构造函数,初始化序列号为0
    private SequenceGenerator() {
        this.sequenceNumber = 0;
    }

    /**
     * 获取下一个序列号。
     * @return 下一个序列号
     */
    public synchronized int getNextSequenceNumber() {
        return sequenceNumber++;
    }
}

// 测试类
public class SequenceGeneratorTest {
    public static void main(String[] args) {
        // 创建一个线程安全的列表来存储生成的序列号
        List<Integer> sequenceNumbers = new CopyOnWriteArrayList<>();

        // 创建多个线程来测试并发生成序列号
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 1000; i++) {
            executorService.submit(() -> {
                int seq = SequenceGenerator.INSTANCE.getNextSequenceNumber();
                sequenceNumbers.add(seq);
            });
        }
        executorService.shutdown();
        try {
            executorService.awaitTermination(1, TimeUnit.MINUTES);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 输出所有生成的序列号,检查是否有重复
        System.out.println(sequenceNumbers);
        System.out.println("Total generated sequences: " + sequenceNumbers.size());
    }
}

结果输出是
在这里插入图片描述

在这个示例中,SequenceGenerator 是一个枚举类,它有一个私有的 sequenceNumber 字段用于存储当前的序列号。getNextSequenceNumber 方法是线程安全的,因为它被声明为 synchronized,确保在多线程环境下不会发生序列号冲突。
在 SequenceGeneratorTest 类中,我们使用了一个 ExecutorService 来模拟并发环境,并使用了一个线程安全的 CopyOnWriteArrayList 来收集生成的序列号,以便验证序列号的正确性。
请注意,虽然 synchronized 关键字能保证线程安全,但在高并发场景下可能会影响性能。如果序列号生成器需要在非常高的并发下工作,可能需要考虑更高效的算法,例如使用原子变量(如 AtomicInteger)或者分布式序列号生成方案。

相关推荐

  1. 【前端设计模式模式

    2024-07-12 09:56:03       56 阅读
  2. 设计模式模式

    2024-07-12 09:56:03       55 阅读
  3. C++设计模式模式

    2024-07-12 09:56:03       55 阅读
  4. 设计模式模式

    2024-07-12 09:56:03       50 阅读
  5. 设计模式模式

    2024-07-12 09:56:03       60 阅读
  6. 设计模式模式

    2024-07-12 09:56:03       50 阅读
  7. 【软件设计模式模式

    2024-07-12 09:56:03       54 阅读
  8. c++设计模式模式

    2024-07-12 09:56:03       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 09:56:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 09:56:03       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 09:56:03       58 阅读
  4. Python语言-面向对象

    2024-07-12 09:56:03       69 阅读

热门阅读

  1. 3 进程

    3 进程

    2024-07-12 09:56:03      19 阅读
  2. 在 Linux/Debian/Ubuntu 上使用 Brasero 刻录光盘

    2024-07-12 09:56:03       19 阅读
  3. 汽车电子助力转向系统研究

    2024-07-12 09:56:03       20 阅读
  4. Debian 12更新:12.6版本发布 2024年6月29日

    2024-07-12 09:56:03       20 阅读
  5. 排序题目:最小时间差

    2024-07-12 09:56:03       30 阅读