最近在看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实现多线程下的单例模式
相关推荐
Java多线程编程环境中单例模式的实现
详细讲解了多线程的四种实现方式(Thread、线程池、Task、委托),以及各种实现方式的优缺点。相信对于想学习多线程的朋友是个不错的选择。
java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...
1、Java有两种实现多线程的方式:通过Runnable接口、通过Thread直接实现,请掌握这两种实现方式,并编写示例程序。 2、多线程是并发执行的,交替占有cpu执行,请编写示例程序,并观察输出结果。 3、采用线程同步方法...
多线程两种实现方式Java,MLDN,实训课程中的多线程
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
C#多线程之如何弹出一个模式窗口来显示进度条 学习版
本资源描述了C++11 中多线程的创建,C++11中std命名空间中将boost库中的Thread加入,boost多线程从准标准变为标准,其中还介绍了C++ 多线程下的单例模式的使用,本文档为txt文档
串口通信的实现,编程环境为C#,实现技术采用了多线程方式
vc++6.0 编写socket多线程例程,非阻塞模式,客户端 服务器端源代码,可运行
NetMQ例子,多线程模式,推拉模式,订阅模式等
Qt两种方法实现多线程的开启,及子线程的安全结束线程,及QMutex加锁,Qt单例化实现
用VB6实现的稳定多线程源码,利用系统的API实现多线程
本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是一本学习和认识JAVA...
用java多线程简易实现生产者消费者模式的代码,用java多线程简易实现生产者消费者模式的代码。
多线程实现Socket通信 多线程实现Socket通信 多线程实现Socket通信
java多线程实现一个控制台聊天室 java多线程实现一个控制台聊天室
多线程进度条(真正的多线程实现) 通过进行间通信,实现的真正的多线程进度条 数据处理与进度条界面处于不同的进程,真正实现进度条的多线程
Linux 多线程实现生产者消费者模式.pdf