druid1.2.8源码阅读:线程池的连接时如何创建的
一、背景
在上次的源码阅读中,发现数据库连接池中连接的创建是通过CreateConnectionThread线程创建出来的。
现在就来追踪下,这个实现的过程。
二、锁和条件
在初始化DruidDataSource实例的过程中,在调用父类DruidAbstractDataSource的构造方法时,初始化了一个锁(Lock)和两个锁条件(Condition):
ReentrantLock lock = new ReentrantLock(lockFair);
Condition notEmpty = lock.newCondition();
Condition empty = lock.newCondition();
三、创建CreateConnectionThread线程实例,并启动线程
在dataSource.getConnection()的init()方法中的createAndStartCreatorThread();中,创建CreateConnectionThread
CreateConnectionThread createConnectionThread = new CreateConnectionThread(threadName);
createConnectionThread.start();
注意,这个线程是一个守护线程:
public CreateConnectionThread(String name){
super(name);
this.setDaemon(true);
}
分析run()方法的逻辑:
- 进入一个无限循环:
for(;;) - 获取一个可中断锁:
lock.lockInterruptibly()
本文详细探讨了Druid1.2.8源码中创建数据库连接的方式,重点关注了线程池的工作机制。在DruidDataSource初始化时,通过ReentrantLock和Condition进行同步控制,然后启动CreateConnectionThread守护线程进行连接创建。在无限循环中,线程获取锁并开始执行任务,确保连接池的高效运行。
2350

被折叠的 条评论
为什么被折叠?



