ToB企服应用市场:ToB评测及商务社交产业平台
标题:
设计模式之单例模式
[打印本页]
作者:
前进之路
时间:
2024-7-13 04:59
标题:
设计模式之单例模式
单例模式确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例
单例模式的主要作用是确保一个类只有一个实例存在
使用场景:
● 作为序列号天生器
● 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)或者分布式序列号天生方案。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4