gpt4 book ai didi

基于参数(名为 mutex/lock)的 Java 同步

转载 作者:IT老高 更新时间:2023-10-28 20:59:20 25 4
gpt4 key购买 nike

我正在寻找一种基于接收到的参数来同步方法的方法,如下所示:

public synchronized void doSomething(name){
//some code
}

我希望 doSomething 方法基于 name 参数进行同步,如下所示:

线程 1:doSomething("a");

线程 2:doSomething("b");

线程 3:doSomething("c");

线程 4:doSomething("a");

线程 1 、线程 2 和线程 3 将执行代码而不同步,但线程 4 将等待线程 1 完成代码,因为它具有相同的“a”值。

谢谢

更新

根据 Tudor 的解释,我认为我面临另一个问题:这是新代码的示例:

private HashMap locks=new HashMap();
public void doSomething(String name){
locks.put(name,new Object());
synchronized(locks.get(name)) {
// ...
}
locks.remove(name);
}

我不填充锁映射的原因是因为 name 可以有任何值。

根据上面的示例,当多个线程同时从hashmap中添加/删除值时会出现问题,因为HashMap不是线程安全的。

所以我的问题是,如果我将 HashMap 设为线程安全的 ConcurrentHashMap,同步块(synchronized block)会阻止其他线程访问 locks.get(name) 吗?

最佳答案

使用映射将字符串与锁对象相关联:

Map<String, Object> locks = new HashMap<String, Object>();
locks.put("a", new Object());
locks.put("b", new Object());
// etc.

然后:

public void doSomething(String name){
synchronized(locks.get(name)) {
// ...
}
}

关于基于参数(名为 mutex/lock)的 Java 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12450402/

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