У меня есть код, похожий на следующий:Синхронизация на двух или более объектов (Java)
public class Cache{
private final Object lock = new Object();
private HashMap<Integer, TreeMap<Long, Integer>> cache =
new HashMap<Integer, TreeMap<Long, Integer>>();
private AtomicLong FREESPACE = new AtomicLong(102400);
private void putInCache(TreeMap<Long, Integer> tempMap, int fileNr){
int length; //holds the length of data in tempMap
synchronized(lock){
if(checkFreeSpace(length)){
cache.get(fileNr).putAll(tmpMap);
FREESPACE.getAndAdd(-length);
}
}
}
private boolean checkFreeSpace(int length){
while(FREESPACE.get() < length && thereIsSomethingToDelete()){
// deleteSomething returns the length of deleted data or 0 if
// it could not delete anything
FREESPACE.getAndAdd(deleteSomething(length));
}
if(FREESPACE.get() < length) return true;
return false;
}
}
putInCache
называется около 139 потоков в секунду. Могу ли я быть уверенным, что эти два метода будут синхронизироваться как на cache
, так и на FREESPACE
? Кроме того, есть checkFreeSpace()
многопоточный сейф. Могу ли я быть уверенным, что будет только один вызов этого метода за раз? Можно ли улучшить «многопоточность» этого кода?
(Нет смысла использовать 'AtomicLong' в этом коде.) –