同步方法还是整个队列?

Sal*_*Sal 4 java synchronization

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

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

思考?

Cod*_*imp 5

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

  • 从文档中可以看出:"迭代器是弱一致的,在迭代器创建时或者自创建迭代器之后的某个时刻返回反映队列状态的元素." 因此,如果您需要使用一致的快照,您可以使用`linkedList`和`synchronized`. (2认同)
  • 另外,据我所知(通过查看backport的来源),`ConcurrentLinkedQueue`不是任何东西的包装器.它是一个独立的集合,无需锁定所有数据即可实现. (2认同)