У меня есть код, подобный следующему:
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()
безопасна ли многопоточность, т. Е. Могу ли я быть уверен, что за один раз будет вызываться только один метод? Можно ли улучшить «многопоточность» этого кода?