队列同步

时间:2013-06-04 01:18:31

标签: java multithreading synchronization queue

在我的程序中,我有一个“发件人”和“接收器”线程,两者都作用于一个队列。

我已在班级中将我的队列定义为:

static Queue<my_class> queue = new LinkedList<my_class>();

但是,我认为我遇到了问题,因为我的Queues未同步。在我的“接收器”线程中,我有时必须从队列中删除会影响“发件人”线程如何操作的项目。

我正在阅读BlockingQueues并且想知道这是否是我在我的情况下需要使用的内容?如果是这样,我该如何更改声明?我是否还需要在“发件人”和“接收者”主题中声明BlockingQueue

BlockingQueue是否确保在任何给定时间只有一个线程访问队列?

抱歉,我对同步的概念很陌生,我发现它很混乱......

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您需要在接收器中声明BlockingQueue,以便它可以使用take方法;发件人仍然可以使用Queue方法使用offer声明,但如果您想使用BlockingQueue方法,则需要声明offer(E e, long timeout, TimeUnit unit)

大多数BlockingQueue实现实际上是无锁的,这意味着一个线程可以添加到它,而另一个线程同时从它获取线程(无锁实现通常比使用锁的实现更具可伸缩性)。无论实现如何,BlockingQueue都是线程安全的。

答案 1 :(得分:0)

主要优点是BlockingQueue提供了正确的线程安全实现。这个运行时实现由并发专家开发,审查和维护。

阻塞队列是一个队列,当您尝试从队列中出队并且队列为空时阻塞,或者如果您尝试将项目排入队列并且队列已满。尝试从空队列中出队的线程被阻塞,直到某个其他线程将项目插入队列。尝试将整个队列中的项排入队列的线程将被阻塞,直到某个其他线程在队列中腾出空间,方法是将一个或多个项目出列或完全清除队列。