// 可重入锁
protected ReentrantLock lock;
//非空条件变量
protected Condition notEmpty;
//空条件变量
protected Condition empty;
public DruidAbstractDataSource(boolean lockFair){
lock = new ReentrantLock(lockFair);
notEmpty = lock.newCondition();
empty = lock.newCondition();
}
这个锁引用特别的多,基本上在所有的线程都在用。
初始化时,会创建CreateConnectionThread,该线程的run方法,先通过lock.lockInterruptibly();加锁,然后使用empty.await();将线程挂起,等待discardConnection,handleFatalError,pollLast,put,shrink等销毁连接的操作时,调用empty.signal()通知,唤醒empty.await()进行后续的创建连接操作。
notEmpty.await()只在takeLast和pollLast的时候使用,在close和创建连接异常时调用notEmpty.signalAll();