`
chenzehe
  • 浏览: 538993 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

多线程环境下单例模式的一种实现方式

 
阅读更多

最近在看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实现多线程下的单例模式

 

 

 

 

分享到:
评论

相关推荐

    autoit 下单程序 源代码

    AutoIt是一种轻量级、强大的自动化脚本语言,主要用于Windows操作系统。这个“autoit 下单程序 源代码”很可能是由台湾开发者编写的,用于实现自动化的交易下单功能,可能适用于股票、期货等金融市场。在金融交易...

    常见设计模式-单例模式

    单例模式是设计模式中的一种,其主要目的是确保一个类只有一个实例,并且提供一个全局访问点来获取这个实例。在Java编程中,实现单例模式有多种方式,每种方式都有其优缺点。 1. **饿汉式**: 饿汉式在类加载时即...

    设计模式大作业.zip

    单例模式可以确保在整个程序生命周期内,该类只被初始化一次,从而节省资源并简化多线程环境下的同步控制。 门面模式作为子系统对外的统一接口,降低了系统的复杂性,为客户端提供了简单的交互方式。在鲜花订购系统...

    Java单例模式.docx

    在DCL中,`volatile`关键字是至关重要的,它能防止指令重排序,确保多线程环境下单例的正确初始化。 总结来说,单例模式在Java中应用广泛,尤其是在工具类、配置类等场景下。选择合适的实现方式取决于是否需要考虑...

    Head First设计模式(中文版)

    书中会展示如何避免多线程环境下单例的并发问题。 3. **建造者模式**:建造者模式将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这有助于在不改变构造逻辑的情况下,修改产品的具体实现。 ...

    JAVA单例模式应用研究

    在这个版本中,`volatile` 关键字确保了多线程环境下单例对象的可见性和有序性。同时,`synchronized` 只在第一次创建实例时起作用,之后的调用将不再进行同步,大大提高了性能。 #### 六、结论 单例模式因其简单...

    单例窗体实现

    在编程领域,单例模式是一种常用的软件设计模式,它的核心思想是确保一个类只有一个实例,并提供全局访问点。在Windows Forms应用中,我们有时需要确保一个特定的窗体(Form)在整个应用程序生命周期中只存在一个...

    C#面试题

    - 在 `GetInstance` 方法内部增加锁机制来确保多线程环境下单例对象的唯一性。 - 使用 `lock` 关键字实现线程安全。 #### 五、数组排序 - 冒泡排序算法 - **算法描述**: - 遍历数组,比较相邻的两个元素。 - ...

    fio中libaio比psync的iops高.docx

    测试结果显示,尽管采用了多线程并发的方式,但psync模式下的各个线程仍然从相同偏移量读取数据。这意味着虽然psync模式在实现上采用了同步机制,但在某些情况下其实际读写行为与libaio模式类似。 #### 三、libaio...

    超市卖场配送系统

    7. **多线程**:如果系统需要处理并发操作,如多个用户同时下单或配送员同时处理多个订单,多线程编程就显得尤为重要。C#提供了Thread类和其他同步机制,如Mutex、Semaphore等,来确保线程安全。 8. **设计模式**:...

    面试题,涵盖golong、mysql、redis、MongoDB、RabbitMQ、Kafka、Docker等等

    可以通过加锁来确保多线程环境下单例的正确性。 #### 7. 错误处理 Golang 中推荐使用错误作为第一个返回值的方式来处理错误。这种方式简洁明了,易于理解。对于复杂的错误处理场景,还可以考虑使用自定义错误类型...

    淘宝京东拼多多唯品会商城自动抢单系统源码抢单接单返利封装app资金盘.txt

    - **多线程处理**:利用多线程技术同时处理多个任务,提升下单效率。 ### 2. 源码解析与应用开发 给定文件提到了“自动抢单系统源码”,这意味着该文件包含了开发自动抢单系统的原始代码。开发者可以基于这些源码...

    MySQL悲观锁总结和实践

    只有数据库层面提供的锁机制才能确保数据访问的排他性,避免多线程或多事务环境下的并发冲突。若仅在应用层面上实现加锁机制,则无法有效防止外部系统或其他应用程序对数据的修改。 #### 二、悲观锁在MySQL中的实现...

    Java+SSM+Mysql+Jsp实现宠物商城系统

    Java的多线程和网络编程特性使得系统能够高效地处理并发请求,确保用户在浏览商品、下单购买等操作时的体验。 **2. Spring框架** Spring是Java企业级应用的核心框架,它简化了配置、依赖注入和AOP(面向切面编程)...

    基于C#实现的餐厅点餐系统.zip

    C#是一种面向对象的编程语言,由微软公司开发,主要用于构建Windows平台的应用程序。在这个餐厅点餐系统中,C#被用来设计和实现用户界面、业务逻辑和数据库交互,以提供一个高效、易用的点餐体验。 一、用户界面...

    基于python的大麦网自动抢票工具的设计与实现(1).zip

    在实现过程中,采用了多线程技术以提高并发性,确保在抢票关键环节的快速响应。此外,还引入了异常处理机制,以应对网络故障或程序错误。 测试与优化是确保抢票工具质量的关键步骤。论文中提到了不同场景下的测试...

    基于python的大麦网自动抢票工具的设计与实现(1) - 副本.zip

    在实现过程中,采用了多线程技术以提高并发性,确保在抢票关键环节的快速响应。此外,还引入了异常处理机制,以应对网络故障或程序错误。 测试与优化是确保抢票工具质量的关键步骤。论文中提到了不同场景下的测试...

    java 超市管理系统

    本系统很可能采用了Model-View-Controller(MVC)架构,这是一种常用的软件设计模式。Model负责数据模型,View负责用户界面展示,Controller处理用户输入并调用Model和View。这种架构有助于代码的解耦,便于维护和...

    基于python的大麦网自动抢票工具的设计与实现(1) - 副本 - 副本.zip

    在实现过程中,采用了多线程技术以提高并发性,确保在抢票关键环节的快速响应。此外,还引入了异常处理机制,以应对网络故障或程序错误。 测试与优化是确保抢票工具质量的关键步骤。论文中提到了不同场景下的测试...

    基于python的大麦网自动抢票工具的设计与实现.docx

    在实现过程中,采用了多线程技术以提高并发性,确保在抢票关键环节的快速响应。此外,还引入了异常处理机制,以应对网络故障或程序错误。 测试与优化是确保抢票工具质量的关键步骤。论文中提到了不同场景下的测试...

Global site tag (gtag.js) - Google Analytics