同步方法还是整个队列?

时间:2012-07-10 23:28:44

标签: java synchronization

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

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

思想?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

如果它是ConcurrentLinkedQueue,并且队列状态只是线程之间共享的数据,则不需要同步任何内容。这就是使用并发集合的重点。生产者 - 消费者设置不应该死锁,除非你做了一些奇怪的事情。 (就像让同一个线程成为生产者和消费者一样。)

答案 2 :(得分:2)

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

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

总结
如果确定性很重要,我会留在ConcurrentLinkedQueue