当前位置: 首页 > 知识库问答 >
问题:

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

濮阳烨然
2023-03-14

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

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

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

线程1:做某事(“A”);

线程2:doSomething(“B”);

线程3:doSomething(“C”);

线程4:做某事(“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);
}

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

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

所以我的问题是,如果我使hashmap成为线程安全的concurrentashmap,同步块是否会阻止其他线程访问locks.get(name)?

共有1个答案

桓修能
2023-03-14

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

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)) {
        // ...
    }
}
 类似资料:
  • 假设我有以下数据 现在我想向添加两个新列,分别命名为和,具有各自的值(1,2)。我可以使用循环来执行此操作,但我想以data.table的方式执行。 结果将是这样的: 到目前为止,我想出了类似这样的东西 其中< code>xx是一个< code > data . table -类似于< code >的命令。N,它寻址< code > by -组的值。 谢谢你的帮助! 附录:for-loop 方式

  • 问题内容: 我正在寻找一种基于接收到的参数来同步方法的方法,如下所示: 我希望基于这样的参数来同步方法: 线程1:doSomething(“ a”); 线程2:doSomething(“ b”); 线程3:doSomething(“ c”); 线程4:doSomething(“ a”); 线程1,线程2和线程3将在不同步的情况下执行代码,但是线程4将等待直到线程1完成代码,因为它具有相同的“ a”

  • 问题内容: MySQL具有方便的功能: 这可用于为应用程序创建简单但非常具体的基于名称的锁。但是,它需要数据库连接。 我有很多情况,例如: 简单地同步此方法是没有意义的,因为,例如,如果在此期间同时为用户B调用了此方法,则用户B无需等待用户A完成操作就可以开始操作,而只需为用户进行操作A和功能X的组合需要等待。 使用MySql锁,我可以执行以下操作: 由于Java锁定基于对象,因此似乎需要创建一个

  • 我想基于输入参数同步一个方法或一个块。 因此,我有一个API,它在post有效负载中有两个长类型的输入(比如id1和id2),可以是原始的,也可以是包装的),可以是JSON。这个API将被多个线程同时或随机地在不同时间调用。 现在如果第一个API调用有ID1=1和ID2=1,同时另一个API调用有ID1=1和ID2=1,它应该等待第一个API调用处理完毕后再执行第二个调用。如果第二个API调用具有

  • 问题内容: 我有以下c#代码从私钥生成数字签名: 然后,我创建了我认为等效的Java代码: 不幸的是,数字签名不匹配。 任何帮助将不胜感激。提前致谢。 编辑 :如果我从Java代码中删除MessageDigest,则输出是相同的。为什么?我以为需要哈希。 问候,尤金 问题答案: Java sign方法基于Signature类的getInstance方法提供的算法进行哈希和签名,因此基本上您在Jav

  • 我已经阅读了spring批处理文档几次,并搜索了一种基于作业参数跳过作业步骤的方法。 我希望能够跳过步骤4,如果希望通过指定在工作Paramaters。 我能找到的唯一相关的问题是如何根据应用程序参数--spring boot java config选择运行哪个spring批处理作业 这似乎表明应该创建两个不同的作业上下文,并在批处理步骤定义之外做出决定。 但是,必须创建4个单独的上下文文件,以便