Есть вот такой интересный код:
private QueryResult _getQueryResult(Statement statement) throws Exception {
QueryResult res = null;
synchronized (getLock(statement)) {
synchronized(qrcache) {
res = qrcache.get(statement);
}
if(res == null){
res = db.select(statement, 0, -1);
synchronized (qrcache) {
qrcache.put(statement, res);
}
}
}
return res;
}
synchronized Object getLock(Object src){
int hash = (src == null)? 0 : src.hashCode();
int lockIndex = Math.abs(hash % locks.length);
Object lock = locks[lockIndex];
if(lock == null){
locks[lockIndex] = lock = new Object();
}
return lock;
}
qrcache - хеш мап кеша, не thread safe
Вопрос: Сколько причин может быть не писать так и почему. Дело в том что интуиция говорит что тут зарыта большая задница, но я ее не могу найти.