I ont un code similaire à ce qui suit:synchronisation sur deux ou plusieurs objets (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
est appelé par environ 139 fils par seconde. Puis-je être sûr que ces deux méthodes vont se synchroniser sur les deux cache
et FREESPACE
? En outre, checkFreeSpace()
multithread-safe est-ce que je peux être sûr qu'il y aura seulement une invocation de cette méthode à la fois? Le "multithread-safety" de ce code peut-il être amélioré?
(Il ne sert à rien d'utiliser 'AtomicLong' dans ce code.) –