したがって、次のようなきちんとしたクラスがあります。
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
}
問題は、複数のスレッドがシングルトンにアクセスするときに、リストを変更するメソッドを同期した呼び出しと、同期されたメソッドの1つによってリストが変更されたために失敗することがある開いている接続をカウントしようとする呼び出しです。
countOpenConnections
メソッドを同期させるだけでは問題は解決しないと確信しています。リストを作成しCollections.synchronizedList
てもあまり効果はないと思います。
私を助けることができるアプローチを持っている人がいますか?