次のようなコードがあります。
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
は、1 秒あたり約 139 スレッドによって呼び出されます。これら 2 つのメソッドが と の両方cache
で同期することを確認できますFREESPACE
か? また、checkFreeSpace()
マルチスレッドセーフですか。つまり、一度にこのメソッドの呼び出しが 1 つだけであることを確認できますか? このコードの「マルチスレッドの安全性」を改善できますか?