由于我没有发现涉及该主题的问题,我想我会分享我对以下场景的解决方案。答案可能很明显,但我走了很长一段路才找到答案。:) 我很感激对问题和答案以及其他解决方案的反馈。
设想:
假设您有一个多线程程序,并且想要为程序中的某些功能建立数据库连接(或其他一些共享对象),而程序的其他部分根本不需要它。不过,与数据库的连接应该只有一个。
同时,您想检测数据库连接丢失并尝试即时重新连接。
为了解决这个问题,您实现了一个延迟加载模式“getter”,它还在返回连接对象之前检查连接有效性。
您的代码可能如下所示:
public class Main {
private DB _db;
public static void main(String[] args) {
new Main().start();
}
private void start() {
// Program code goes here
// You create several threads, some of which may call getDB() whenever they need DB access
}
public DB getDB() {
if (_db == null) {
_db = getDBConnection();
} else if (!_db.isConnectionValid()) {
/*
* DB connection is not valid anymore. Let's close it and
* try to get a new connection.
*/
_db.close();
_db = getDBConnection();
}
return _db;
}
private DB getDBConnection() {
DB db;
// Obtain a new connection...
...
return db;
}
}
问题:
多个线程可能几乎同时尝试获取数据库连接。当某些类保持对它们的引用时,甚至有可能多个连接共存。