java同步基于参数

前端之家收集整理的这篇文章主要介绍了java同步基于参数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在寻找一种基于接收到的参数同步方法的方式,如下所示:
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”值.

谢谢

UPDATE

基于都铎的解释,我认为我面临另一个问题:
以下是新代码的示例:

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

我不填充锁图的原因是因为名称可以有任何价值.

基于上述示例,由于HashMap不是线程安全的,所以在同时从多个线程添加/删除hashmap中的值时,可能会出现该问题.

所以我的问题是如果我使HashMap是一个ConcurrentHashMap,它是线程安全的,同步块将阻止其他线程访问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)) {
        // ...
    }
}

猜你在找的Java相关文章