当前位置: 首页 > 面试题库 >

Java根据参数进行同步(名为互斥锁)

上官琦
2023-03-14
问题内容

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

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不是线程安全的,因此在多个线程同时从哈希映射中添加/删除值时,可能会出现问题。

所以我的问题是,如果我使HashMapa
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)) {
        // ...
    }
}


 类似资料:
  • 类型 pthread_mutex_t 互斥锁基本操作 函数 描述 [[pthread_mutex_init pthread_mutex_init]] 初始化互斥锁 [[pthread_mutex_lock pthread_mutex_lock]] 阻塞申请互斥锁 [[pthread_mutex_unlock pthread_mutex_unlock]] 释放互斥锁 [[pthread_mutex_

  • 问题内容: 我需要在Java中实现某种进程间互斥。我正在考虑按照此[线程的](http://codingdict.com/questions/1808建议使用FileLock API 。我基本上将使用一个虚拟文件并将其锁定在每个进程中。 这是最好的方法吗?还是这样的东西内置在标准API中(我找不到)。 有关更多详细信息,请参见以下内容: 我编写了一个应用程序,该应用程序可以读取一些输入文件,并根据

  • 我正在开发一个以时事通讯风格界面为中心的iPad应用程序。我使用苹果的UIPageViewController来做到这一点。 我遇到了很多我不完全理解的错误,我希望有人能帮助我找到解决方法。 在这个界面上翻页时,应用程序偶尔会冻结(这就是为什么它如此令人沮丧,因为它不容易复制)。我在调试器中暂停应用程序,这是它显示给我的http://cl.ly/image/1y3c2x351t0T. 我很清楚这是

  • 我正在寻找一种基于方法接收到的参数来同步方法的方法,如下所示: 我希望基于参数同步方法,如下所示: 线程1:做某事(“A”); 线程2:doSomething(“B”); 线程3:doSomething(“C”); 线程4:做某事(“A”); 线程1、线程2和线程3将在没有同步的情况下执行代码,但是线程4将等待线程1完成代码,因为它具有相同的“a”值。 谢谢 更新 基于Tudor的解释,我认为我面

  • 我不明白的是,当condition_variable和互斥体之间没有任何链接的时候,为什么所有4个线程都可以在互斥体上获得锁?

  • 更多面试题总结请看:【面试题】技术面试题汇总 基本概念 临界资源:一次仅允许一个进程使用的共享资源,也就是互斥资源 临界区:程序中访问临界资源的那段代码,也称危险区、敏感区 互斥:多个程序片段,同一时刻仅有一个能进入临界区 同步:若干程序片断运行必须严格按照规定的某种先后次序来运行。同步是一种更复杂的互斥:互斥不会限制程序对资源的访问顺序,即访问是无序的;而同步必须要按照某种次序来运行 临界区管理