Java并发控制多锁

McC*_*Coy 5 java concurrency semaphore locking

我有一个临界区,我需要控制只有那些具有给定属性值的线程才能同时进入。

例如:我有 Thread#1 处理产品,Thread#2 也处理产品,Thread#3 处理服务

现在:

  1. T1先来,进入临界区,使产品得到处理

  2. T2想进入,但是因为还有一个产品正在加工,所以必须等待

  3. T3排在最后,它可以进入,因为它需要一个服务(而不是一个产品)来处理

  4. T1出去了,现在T2可以进去了

我认为它看起来很简单,但我找不到任何符合要求的东西。我的问题是,我怎样才能做到这一点?对有关此信息的任何来源的任何参考都将不胜感激

非常感谢您提前

bea*_*u13 6

这个怎么样:

private ConcurrentMap<Integer, Semaphore> semaphores = new ConcurrentHashMap<>();

public void enter(int id) {
    Semaphore s = semaphores.computeIfAbsent(id, key -> new Semaphore(1));

    try {
        s.acquire();
        // Critical section.
    } catch (InterruptedException e) {
        // Exception handling.
    } finally {
        s.release();
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 哈希映射保证快速访问并且可以动态增长。此外,您可以使用对象作为键。
  • 如果您在编译时知道 ID 的数量,您还可以使用不可修改或不可变的映射并对其进行预填充。
  • 信号量也可以调整:为不同的ID设置不同的许可数量和公平保证。
  • 包装类可以提供额外的方法,例如非阻塞tryEnter(int)via Semaphore#tryAcquire()