最近在看dubbo的源代码,发现dubbo类ExtensionLoader中有一段代码:
private static final ConcurrentMap<Class<?>, ExtensionLoader<?>> EXTENSION_LOADERS = new ConcurrentHashMap<Class<?>, ExtensionLoader<?>>(); public static <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) { if (type == null) throw new IllegalArgumentException("Extension type == null"); if(!type.isInterface()) { throw new IllegalArgumentException("Extension type(" + type + ") is not interface!"); } if(!withExtensionAnnotation(type)) { throw new IllegalArgumentException("Extension type(" + type + ") is not extension, because WITHOUT @" + SPI.class.getSimpleName() + " Annotation!"); } ExtensionLoader<T> loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type); if (loader == null) { EXTENSION_LOADERS.putIfAbsent(type, new ExtensionLoader<T>(type)); loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type); } return loader; }
EXTENSION_LOADERS.putIfAbsent(type, new ExtensionLoader<T>(type)); loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type); 不明白作者这段代码的用意,为什么不如下面这么写: loader = new ExtensionLoader<T>(type); EXTENSION_LOADERS.putIfAbsent(type,loader); 这么写的玄机是什么?
不用这里写法,是为了保证取的对象是同一个
putIfAbsent是key存在就不替换,这里return回去的都是从map里get出来的,而不是new出来的
对构造函数的封装,使用并发的ConcurrentHashMap实现多线程下的单例模式
相关推荐
文中分别讲解了三种实现方式:基于 sync.Once 实现的一次性初始化机制(懒汉模式),双检查锁机制(Double-checked Locking,DCL)下对共享资源的操作减少加锁频率从而提高效率的技术手段,还有借助原子指令完成的...
AutoIt是一种轻量级、强大的自动化脚本语言,主要用于Windows操作系统。这个“autoit 下单程序 源代码”很可能是由台湾开发者编写的,用于实现自动化的交易下单功能,可能适用于股票、期货等金融市场。在金融交易...
单例模式是设计模式中的一种,其主要目的是确保一个类只有一个实例,并且提供一个全局访问点来获取这个实例。在Java编程中,实现单例模式有多种方式,每种方式都有其优缺点。 1. **饿汉式**: 饿汉式在类加载时即...
单例模式可以确保在整个程序生命周期内,该类只被初始化一次,从而节省资源并简化多线程环境下的同步控制。 门面模式作为子系统对外的统一接口,降低了系统的复杂性,为客户端提供了简单的交互方式。在鲜花订购系统...
在DCL中,`volatile`关键字是至关重要的,它能防止指令重排序,确保多线程环境下单例的正确初始化。 总结来说,单例模式在Java中应用广泛,尤其是在工具类、配置类等场景下。选择合适的实现方式取决于是否需要考虑...
书中会展示如何避免多线程环境下单例的并发问题。 3. **建造者模式**:建造者模式将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这有助于在不改变构造逻辑的情况下,修改产品的具体实现。 ...
在这个版本中,`volatile` 关键字确保了多线程环境下单例对象的可见性和有序性。同时,`synchronized` 只在第一次创建实例时起作用,之后的调用将不再进行同步,大大提高了性能。 #### 六、结论 单例模式因其简单...
2. 单例模式:在某些特定的单例模式实现中,如双重检查锁定模式(Double-Checked Locking),volatile能够确保多线程环境下单例对象的安全性。这种模式下,volatile变量确保了对象实例在构造期间的可见性,防止了多...
在编程领域,单例模式是一种常用的软件设计模式,它的核心思想是确保一个类只有一个实例,并提供全局访问点。在Windows Forms应用中,我们有时需要确保一个特定的窗体(Form)在整个应用程序生命周期中只存在一个...
- 在 `GetInstance` 方法内部增加锁机制来确保多线程环境下单例对象的唯一性。 - 使用 `lock` 关键字实现线程安全。 #### 五、数组排序 - 冒泡排序算法 - **算法描述**: - 遍历数组,比较相邻的两个元素。 - ...
测试结果显示,尽管采用了多线程并发的方式,但psync模式下的各个线程仍然从相同偏移量读取数据。这意味着虽然psync模式在实现上采用了同步机制,但在某些情况下其实际读写行为与libaio模式类似。 #### 三、libaio...
7. **多线程**:如果系统需要处理并发操作,如多个用户同时下单或配送员同时处理多个订单,多线程编程就显得尤为重要。C#提供了Thread类和其他同步机制,如Mutex、Semaphore等,来确保线程安全。 8. **设计模式**:...
可以通过加锁来确保多线程环境下单例的正确性。 #### 7. 错误处理 Golang 中推荐使用错误作为第一个返回值的方式来处理错误。这种方式简洁明了,易于理解。对于复杂的错误处理场景,还可以考虑使用自定义错误类型...
- **多线程处理**:利用多线程技术同时处理多个任务,提升下单效率。 ### 2. 源码解析与应用开发 给定文件提到了“自动抢单系统源码”,这意味着该文件包含了开发自动抢单系统的原始代码。开发者可以基于这些源码...
Java是一种广泛使用的面向对象的编程语言,它具有跨平台、安全性强、多线程等特点。Java为开发高性能、可维护、可扩展的电子商务网站提供了技术保障。 三、系统设计与实现 3.1 系统架构设计 图书电子商务网站采用B...
2. Java技术:Java是一种广泛使用的面向对象的编程语言,它具有平台无关性、安全性、多线程和网络编程能力等优势。在企业销售管理系统开发中,Java能够提供稳定和高效的应用程序开发解决方案,尤其适合于网络环境下...
网上订餐系统是一种以网络为平台,使用户能够在线浏览菜单、选择菜品并进行订购的软件系统。基于ssm(Spring、SpringMVC、MyBatis)框架的网上订餐系统,是当前较为主流的技术实现方式之一。ssm框架结合了Spring的...
只有数据库层面提供的锁机制才能确保数据访问的排他性,避免多线程或多事务环境下的并发冲突。若仅在应用层面上实现加锁机制,则无法有效防止外部系统或其他应用程序对数据的修改。 #### 二、悲观锁在MySQL中的实现...
Java的多线程和网络编程特性使得系统能够高效地处理并发请求,确保用户在浏览商品、下单购买等操作时的体验。 **2. Spring框架** Spring是Java企业级应用的核心框架,它简化了配置、依赖注入和AOP(面向切面编程)...
C#是一种面向对象的编程语言,由微软公司开发,主要用于构建Windows平台的应用程序。在这个餐厅点餐系统中,C#被用来设计和实现用户界面、业务逻辑和数据库交互,以提供一个高效、易用的点餐体验。 一、用户界面...