所以我们有一个整洁的类,看起来类似于:
class ConnectionObserver {
private List<DbConnection> connections;
// singleton logic
public synchronized void closeConnection(int id) {
for(Iterator<DbConnection> it = connections.iterator(): it.hasNext()) {
DbConnection conn = it.next();
if(conn.getId() == id) {
conn.close();
it.remove();
}
}
}
public int countOpenConnections() {
int open = 0;
for(DbConnection conn : connections) {
if(conn.isOpen()) {
++open;
}
}
return open;
}
// more synchronized methods which alter the list via iterators
}
问题是,当多个线程访问单例时,一些调用同步了更改列表的方法,并且一些尝试计算打开的连接,这些连接有时会失败,因为同时列表被同步方法之一更改。
我相信仅仅使方法countOpenConnections
同步也不能解决问题。我认为,列出清单 aCollections.synchronizedList
也不会做太多事情。
你们中的一些人有什么方法可以帮助我吗?