同步集合列表

时间:2013-03-17 20:33:30

标签: java list linked-list queue synchronized

我有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>());
     

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

其他信息:

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

Collections.synchronizedList会返回SynchronizedList的实例,但不会扩展QueueLinkedListQueue,但那不是您当时使用的内容。