如何同步添加元素和从队列中删除元素

时间:2014-02-28 21:45:50

标签: java multithreading collections queue synchronized

我需要某种类型的队列来同步添加新元素和删除新元素:

同步应该是添加元素,删除元素以及添加/删除方法。

我想到了一些选择:
1.找到一个线程安全的队列实现,这意味着无论调用哪个方法都会阻止它访问队列 - >也许不是那么聪明......

2.在某些锁定对象上使用synchronize添加/删除元素方法.-->这个解决方案看起来有点难看。

您对此有何看法?

3 个答案:

答案 0 :(得分:1)

  

我需要某种类型的队列来同步添加新元素和删除新元素:

您应该使用BlockingQueue(例如ArrayBlockingQueue)来处理所有同步。您调用queue.add(...)添加到队列,另一个线程调用take()以从队列中删除项目。

答案 1 :(得分:1)

或者:3。使用其中一个线程安全的BlockingQueues,使用无锁算法,并使用阻塞和非阻塞方法。

答案 2 :(得分:1)

对于聪明且不那么丑陋的解决方案,您需要在某个包装器中编写自己的线程安全操作,但不应使用synchronized,而应使用ReadWriteLocks。 无论如何其他不错的选择是谷歌番石榴库。你没有提到任何绑定/阻塞操作需要,所以我不认为BlockingQueue是一个很好的选择。我推荐Guava的ConcurrentLinkedQueue,这是一个基于链接节点的无界线程安全队列。

希望这会有所帮助。有关详细信息,请浏览此链接: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Queues.html

ConcurrentLinkedQueue页面是: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html?is-external=true