我遇到了必须根据输入同步功能的情况。例如。有功能。 func(int a)---如果这个函数试图用相同的输入整数调用这个函数,那么我想阻塞这个函数。否则让他们继续而不继续。我写了函数
HashTable<Integer> check=new Hashtable<Integer>();
func(int a){
Integer lock=check.get(a);
if(lock==null){
check.put(a);
}else{
check.put(a);
}
synchronized(lock){
//do something....
} }
如果这是对的,请告诉我。如果还有除此之外的任何其他解决方案。我想弄清楚。如果我找到答案,我会发布。
答案 0 :(得分:1)
1)获得锁也应该在同步块中
2)存在内存泄漏 - 您不会删除未使用的锁
我会这样做
Map<Integer, Lock> map = new HashMap<>();
static class Lock {
int count = 1;
}
void func(int i) {
Object lock = getLock(i);
try {
synchronized (lock) {
//
}
} finally {
releaseLock(i);
}
}
private synchronized Object getLock(int i) {
Lock lock = map.get(i);
if (lock != null) {
lock.count++;
} else {
lock = new Lock();
map.put(i, lock);
}
return lock;
}
private synchronized void releaseLock(int i) {
Lock lock = map.get(i);
if (--lock.count == 0) {
map.remove(i);
}
}