Browse Source

生产连接的线程切换时,加个双检锁,确保线程状态准确

release/9.0
abel 6 years ago
parent
commit
9a756e4b3b
  1. 20
      fine-druid/src/com/fr/third/alibaba/druid/pool/DruidDataSource.java

20
fine-druid/src/com/fr/third/alibaba/druid/pool/DruidDataSource.java

@ -620,14 +620,18 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
private void checkThread() throws SQLException {
if (!createConnectionThread.isStarted() && !destroyConnectionThread.isStarted()) {
createConnectionThread.setStarted(true);
createConnectionThread.start();
destroyConnectionThread.setStarted(true);
destroyConnectionThread.start();
try {
initedLatch.await();
} catch (InterruptedException e) {
throw new SQLException(e.getMessage(), e);
synchronized (this) {//线程安全问题,加个双检锁
if (!createConnectionThread.isStarted() && !destroyConnectionThread.isStarted()) {
createConnectionThread.setStarted(true);
createConnectionThread.start();
destroyConnectionThread.setStarted(true);
destroyConnectionThread.start();
try {
initedLatch.await();
} catch (InterruptedException e) {
throw new SQLException(e.getMessage(), e);
}
}
}
}
}

Loading…
Cancel
Save