【问题标题】:BlockingQueue like container that doesn't allow duplicatesBlockingQueue 类似容器,不允许重复
【发布时间】:2015-07-10 20:59:39
【问题描述】:

我想要一个线程安全的容器,它会阻塞调用者,直到项目可用。物品将以每秒 1000 秒的速度添加到此容器中,但不会以相同的速度排出。因此,我希望容器不允许重复。 我围绕 LinkedBlockingQueue 编写了一个非常简单的包装器,但很快意识到我重新创建了经典的生产者-消费者死锁。这是我写的:

public class ActivityListener {
    private final BlockingQueue<ID> activeItems = new LinkedBlockingQueue<>();

    public synchronized ID take() throws InterruptedException {
        return activeItems.take();
    }

    public synchronized void registerActivity(final ID item) {
        if (!activeItems.contains(item)) {
            activeItems.add(item);
        }
    }

    public synchronized boolean isItemActive(final ID item) {
        return activeItems.contains(item);
    }
}

我找不到解决问题的既定方法,希望能提供任何帮助。

【问题讨论】:

标签: java thread-safety java.util.concurrent blockingqueue


【解决方案1】:

覆盖任何 BlockingQueue 实现的 add() 和 put() 方法,首先检查元素是否已经在队列中。

有点像 -

@Override
public boolean add(T obj) {
    if (contains(obj))
        return true;
    return super.add(obj);
}

【讨论】:

  • 这不是线程安全的,不幸的是可能无法做到这一点(至少在一般情况下)。
  • 另外,当对象未添加到集合中时,从类集合接口上的 add 方法返回 true 是非常不习惯的。
猜你喜欢
  • 2013-07-10
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 2013-11-16
相关资源
最近更新 更多