【问题标题】:Synchronization of Queues队列同步
【发布时间】:2013-06-04 01:18:31
【问题描述】:

在我的程序中,我有一个“发送者”和“接收者”线程,它们都作用于一个队列。

我在课堂上将队列定义为:

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

但是,我认为我遇到了问题,因为我的 Queues 没有同步。在我的“接收者”线程中,有时我必须从队列中删除项目,这会影响“发送者”线程的运行方式。

我正在阅读有关BlockingQueues 的信息,想知道在我的情况下是否需要使用它?如果是这样,我该如何更改我的声明?我是否还需要在“Sender”和“Receiver”线程中声明BlockingQueue

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

对不起,我对同步的概念很陌生,我觉得它很混乱..

感谢您的帮助。

【问题讨论】:

  • 请阅读Queue Implementations
  • BlockingQueue 是一个接口;如果您不需要Queue 已经提供的任何其他方法(注意BlockingQueue 扩展Queue),那么您可以使用线程安全版本初始化您的Queue,例如LinkedBlockingQueue
  • " 在我的“接收者”线程中,有时我必须从队列中删除项目,这会影响“发送者”线程的运行方式。”
  • @fge 在我的“发件人”线程中,我根据队列中的第一项更新变量。因此,在“Receiver”线程从队列中删除值之后,“Sender”线程应该正确使用队列中的第一项来更新此变量。谢谢。
  • @Giri 那是什么变量?这个变量的值是否真的取决于任何时间点队列中的第一项?

标签: java multithreading synchronization queue


【解决方案1】:

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

阻塞队列是当您尝试从其出队但队列为空,或者您尝试将项目入队但队列已满时阻塞的队列。试图从空队列中出列的线程被阻塞,直到其他线程将项目插入队列。试图将一个项目排入一个完整队列的线程被阻塞,直到某个其他线程通过使一个或多个项目出队或完全清除队列来在队列中腾出空间。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 2023-03-07
      • 2019-02-10
      • 2021-12-17
      • 2011-02-01
      相关资源
      最近更新 更多