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()