【发布时间】:2009-11-27 11:10:55
【问题描述】:
我有类似下面的代码:
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毫无意义。)
标签: java object synchronized multithreading