gpt4 book ai didi

java - 基于函数输入的线程 block

转载 作者:搜寻专家 更新时间:2023-11-01 03:40:15 25 4
gpt4 key购买 nike

我遇到了必须根据输入同步功能的情况。例如。有功能。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....

}

请告诉我这是否正确。另外,如果除此之外还有其他解决方案。我想弄清楚。如果我找到答案,我会发布它。

最佳答案

1) 获取锁也应该在同步块(synchronized block)中

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);
}
}

关于java - 基于函数输入的线程 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16512202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com