同步集合列表



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

起始值

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

使用上面的代码,我得到了一个类型不匹配:不能从List转换到Queue

我尝试将其强制转换为Queue,但这不起作用。

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

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

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

如何使用ConcurrentLinkedQueue?

在正确答案第6段

如果你只有一个线程把东西放入队列,另一个线程从队列中取出东西,ConcurrentLinkingQueue是可能过分了。当你可能有几百甚至更多的时候数千个线程同时访问队列。你的需求可以使用:

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

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

附加信息:

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

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

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

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

Collections.synchronizedList返回一个不扩展QueueSynchronizedList实例。LinkedList是一个Queue,但那不是你现在使用的。

相关内容

  • 没有找到相关文章

最新更新