首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java并发控制多个锁

Java并发控制多个锁
EN

Stack Overflow用户
提问于 2016-08-22 17:38:42
回答 4查看 1.2K关注 0票数 5

我有一个关键部分,我需要控制只有那些具有给定属性值的线程能够同时进入。

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

现在:

  1. T1首先进入关键部分,以便处理产品。
  2. T2想要进入,但是由于有另一个正在处理的产品,它必须等待。
  3. T3是最后一个,它能够进入,因为它需要一个服务(而不是一个产品)来处理。
  4. T1出去了,现在T2可以进去了

我认为这看起来很简单,但我找不到符合要求的东西。我的问题是,我怎样才能做到这一点?如能参考有关资料来源,将不胜感激。

先谢谢你

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-27 12:08:42

这个怎么样:

代码语言:javascript
复制
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();
    }
}
  • 哈希映射保证了快速访问,并且可以动态增长。此外,您还可以使用对象作为键。
  • 如果在编译时知道it的数量,还可以使用不可修改或不可更改的映射并对其进行预填充。
  • 信号量也可以调整:为不同的ID设置不同数量的许可和公平保证。
  • 包装类可以提供额外的方法,例如,通过tryEnter(int)通过Semaphore#tryAcquire()实现非阻塞的方法。
票数 7
EN

Stack Overflow用户

发布于 2016-08-22 17:43:22

我认为您无法锁定值类型,但请尝试以下解决方法:将锁对象放入数组并从ID访问数组。

类似于:

代码语言:javascript
复制
private Object[] locks = new Object[] {new Object(), new Object()};

private void yourMethod(int id)
{
    synchronized(locks[id]) //or id - 1 if you want to stick to your 1 and 2
    {
        //do your things
    }
}

希望它能帮上忙

票数 2
EN

Stack Overflow用户

发布于 2016-08-22 18:08:58

如果您确实需要这样的逻辑,则可以这样实现:

代码语言:javascript
复制
private final Lock lock = new Lock();

public void process() {
    boolean locked = false;
    if (isProduct()) {   // Depends on the current thread
        lock.lock();
        locked = true;
    }

    try {
        // Do the work here
    } finally {
        if (locked) {
            lock.unlock();
        }
    }
}

但这个问题本身就说明了一个糟糕的设计。只需创建方法processProduct()processService(),创建第一个synchronized并从线程中调用您真正需要的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39085565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档