java同步基于参数
发布时间:2020-12-14 16:36:00 所属栏目:Java 来源:网络整理
导读:我正在寻找一种基于接收到的参数同步方法的方式,如下所示: public synchronized void doSomething(name){//some code} 我希望doSomething方法基于name参数进行同步: 线程1:doSomething(“a”); 线程2:doSomething(“b”); 线程3:doSomething(“c”); 线
我正在寻找一种基于接收到的参数同步方法的方式,如下所示:
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)) { // ... } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |