这是commons-dbcp2的源代码,为什么它可以避免NPE?
public int getNumActive() {
// Copy reference to avoid NPE if close happens after null check
GenericObjectPool<PoolableConnection> pool = connectionPool;
if (pool != null) {
return pool.getNumActive();
}
return 0;
}
答案 0 :(得分:0)
请注意,变量connectionPool
已复制到新变量pool
中。当存在多线程*的可能性并且原始变量(connectionPool
)被不同的线程覆盖/清除时,使用这种复制引用和使用新引用的模式。
在这种情况下,如果有两个线程,一个调用close
方法和另一个调用getNumActive
方法,则第一个close方法可能会清除connectionPool变量,然后getNumActive方法尝试运行。
如果发生这种情况,那么即使原始变量清除,其副本(pool
)仍然存在。因此pool.getNumActive();
永远不会导致NPE
*非常草率的