【发布时间】: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