如果一个队列要被多个线程访问,但它目前只被单个方法getNextInQueue()
修改,那么同步访问队列的最合适形式是什么?
目前,我将队列声明为ConcurrentLinkedQueue
,但我不想达到多个线程等待释放锁的死锁。我可以解决这个问题的另一种方法是不同步队列,而是同步getNextInQueue()
。但是,由于将来会使用此代码,我认为这也不会扩展。 (每个对队列进行修改的程序员都必须确保她同步操作。)
思想?
答案 0 :(得分:5)
我认为最简单,最正确的方法是使用ConcurrentLinkedQueue
。但是,我不认为这会导致僵局。但是,我不确定的一件事是Concurrent包装器如何处理使用迭代器的情况。我似乎记得不得不回到旧的synchronized
方法来包装对底层集合的所有调用(读取和写入)。我很确定这是Concurrent包装器正在做的事情。
答案 1 :(得分:3)
如果它是ConcurrentLinkedQueue
,并且队列状态只是线程之间共享的数据,则不需要同步任何内容。这就是使用并发集合的重点。生产者 - 消费者设置不应该死锁,除非你做了一些奇怪的事情。 (就像让同一个线程成为生产者和消费者一样。)
答案 2 :(得分:2)
仅同步getNext()
不是一个好主意 - 如果你想这样做,你也必须同步insert
。
示例:
如果队列中没有元素,并且线程A尝试getNext()
并且没有完成执行该方法 - 一个新项目可以通过线程B插入到队列中,这将导致队列中的线程A挂起,即使其中有新项目。
总结:
如果确定性很重要,我会留在ConcurrentLinkedQueue