【问题标题】:Synchronized collections list同步集合列表
【发布时间】:2013-03-17 20:33:30
【问题描述】:

我有 2 个线程需要访问队列,一个用于放置,一个用于获取。

所以我有一个启蒙

public static Queue<WorldData>          blockDestructionQueue   = Collections.synchronizedList(new LinkedList<WorldData>());

上面我得到一个类型不匹配:无法从列表转换为队列

我尝试将其投射到队列中,但这不起作用。

public static Queue<WorldData>          blockDestructionQueue   = (Queue<WorldData>)Collections.synchronizedList(new LinkedList<WorldData>());

我想知道为什么这不起作用。

我从另一个堆栈溢出答案中获得了此信息。

How to use ConcurrentLinkedQueue?

在正确答案第 6 段中

如果您只有一个线程将内容放入队列,而另一个线程 线程从队列中取出东西,ConcurrentLinkingQueue 是 可能矫枉过正。当你可能有数百甚至更多时 数以千计的线程同时访问队列。您的需求 可能会通过使用来满足:

Queue<YourObject> queue = Collections.synchronizedList(new LinkedList<YourObject>());

它的一个优点是它锁定了实例(队列),所以你可以 在队列上同步以确保复合操作的原子性(如 贾里德解释)。您不能使用 ConcurrentLinkingQueue 执行此操作, 因为所有操作都是在没有锁定实例的情况下完成的(使用 java.util.concurrent.atomic 变量)。你不需要这样做 如果你想在队列为空时阻塞,因为 poll() 会 只需在队列为空时返回 null,并且 poll() 是原子的。 检查 poll() 是否返回 null。如果是,wait(),然后尝试 再次。无需锁定。

附加信息:

编辑:Eclipse 试图提供太多帮助,并决定在不需要且未被要求放置的地方添加一个断点异常。

【问题讨论】:

  • “正确”的答案不一定完全正确。
  • 列表不是队列——为什么不使用 LinkedBlockingQueue;它是为这种模式设计的。当 List 为空时,消费者将阻塞。
  • 我没有使用 LinkedBlockingQueue 的原因是他的帖子中提到的“正确”答案,其中 LinkedBlockingQueue 比 SyncronizedList 更密集

标签: java list linked-list queue synchronized


【解决方案1】:

队列不是列表,Queue 不是List 的实现,尽管您可以使用列表实现队列。

看看 BlockingQueue 它可能更适合您的需要:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html

【讨论】:

  • 我尝试实现这一点,但出现以下错误 此行有多个标记 - 标记“(”上的语法错误,此标记后应为表达式 - 标记“(”上的语法错误,此后应为表达式具有公共静态 BlockingQueue blockDestructionQueue = LinkedBlockingQueue(); 的令牌
  • 不要忘记关键字'new',它非常(非常非常)重要。 ;)
  • 另外,还有一些 StackOverflow 新手建议 - 不要忘记为对您有帮助的答案投票,并接受能回答您问题的答案。
【解决方案2】:

Collections.synchronizedList 返回一个 SynchronizedList 的实例,它不扩展 QueueLinkedListQueue,但这不是您当时使用的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2013-03-04
    • 2019-10-13
    • 2019-10-08
    • 2020-03-23
    • 1970-01-01
    • 2015-04-28
    相关资源
    最近更新 更多