4

如果一个队列要被多个线程访问,但它目前只被一个方法修改getNextInQueue(),那么同步访问队列的最合适的形式是什么?

目前,我将队列声明为 a ConcurrentLinkedQueue,但我不想遇到多个线程正在等待释放锁的死锁。我可以处理的另一种方法是不同步队列,而是同步getNextInQueue(). 但是,由于将来会使用此代码,因此我认为这也不会扩展。(每个对队列进行修改的程序员都必须确保她同步操作。)

想法?

4

3 回答 3

5

我认为最简单,最正确的方法是使用ConcurrentLinkedQueue. 但是,我不相信这会导致僵局。但是,我不确定的一件事是 Concurrent 包装器如何处理使用迭代器的情况。我似乎记得不得不回退到synchronized包装对底层集合(读取和写入)的所有调用的旧方法。不过,我很确定这就是 Concurrent 包装器正在做的事情。

于 2012-07-10T23:34:58.170 回答
3

如果是ConcurrentLinkedQueue,并且队列状态只是线程之间共享的数据,则不需要同步任何内容。这就是使用并发集合的全部意义所在。除非您在做一些奇怪的事情,否则生产者-消费者设置不应陷入僵局。(就像让同一个线程成为生产者和消费者一样。)

于 2012-07-10T23:35:12.617 回答
2

只同步getNext()不是一个好主意——如果你想这样做,你也必须同步insert

示例:
如果队列中没有元素并且线程 A 尝试getNext()执行并且没有完成该方法的执行 - 线程 B 可以将新项目插入队列,这将导致线程 A 在队列中挂起,即使有是其中的一个新项目。

总结
如果一致性很重要,我会留下来ConcurrentLinkedQueue

于 2012-07-10T23:32:44.940 回答