ToB企服应用市场:ToB评测及商务社交产业平台

标题: 设计模式之单例模式 [打印本页]

作者: 前进之路    时间: 2024-7-13 04:59
标题: 设计模式之单例模式
单例模式确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例
单例模式的主要作用是确保一个类只有一个实例存在
使用场景:
● 作为序列号天生器
● Web页面的计数器,避免每次刷新都在数据库中增长技术,先缓存起来
● 创建消耗资源过多的对象,如I/O与数据库连接等
单例模式存在7种实现方法
主要分为饿汉式和懒汉式
饿汉式:类加载就会导致该单实例对象被创建
懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时才会创建。
这里示范实现单例模式的最佳方法:以罗列的方式来实现单例模式并使用(实现序列号天生器)
  1. public enum SequenceGenerator {
  2.     INSTANCE;
  3.     private int sequenceNumber;
  4.     // 构造函数,初始化序列号为0
  5.     private SequenceGenerator() {
  6.         this.sequenceNumber = 0;
  7.     }
  8.     /**
  9.      * 获取下一个序列号。
  10.      * @return 下一个序列号
  11.      */
  12.     public synchronized int getNextSequenceNumber() {
  13.         return sequenceNumber++;
  14.     }
  15. }
  16. // 测试类
  17. public class SequenceGeneratorTest {
  18.     public static void main(String[] args) {
  19.         // 创建一个线程安全的列表来存储生成的序列号
  20.         List<Integer> sequenceNumbers = new CopyOnWriteArrayList<>();
  21.         // 创建多个线程来测试并发生成序列号
  22.         ExecutorService executorService = Executors.newFixedThreadPool(10);
  23.         for (int i = 0; i < 1000; i++) {
  24.             executorService.submit(() -> {
  25.                 int seq = SequenceGenerator.INSTANCE.getNextSequenceNumber();
  26.                 sequenceNumbers.add(seq);
  27.             });
  28.         }
  29.         executorService.shutdown();
  30.         try {
  31.             executorService.awaitTermination(1, TimeUnit.MINUTES);
  32.         } catch (InterruptedException e) {
  33.             e.printStackTrace();
  34.         }
  35.         // 输出所有生成的序列号,检查是否有重复
  36.         System.out.println(sequenceNumbers);
  37.         System.out.println("Total generated sequences: " + sequenceNumbers.size());
  38.     }
  39. }
复制代码
结果输出是

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4