Java 同步集合列表

Java 同步集合列表,java,list,linked-list,queue,synchronized,Java,List,Linked List,Queue,Synchronized,我有两个线程需要访问队列,一个用于放置,一个用于获取 所以我有一个开始 public static Queue<WorldData> blockDestructionQueue = Collections.synchronizedList(new LinkedList<WorldData>()); publicstaticqueue blockDestructionQueue=Collections.synchronizedList(newlink

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

所以我有一个开始

public static Queue<WorldData>          blockDestructionQueue   = Collections.synchronizedList(new LinkedList<WorldData>());
publicstaticqueue blockDestructionQueue=Collections.synchronizedList(newlinkedlist());
通过以上操作,我得到了一个类型不匹配:无法从列表转换到队列

我试着把它放到队列中,但这不起作用

public static Queue<WorldData>          blockDestructionQueue   = (Queue<WorldData>)Collections.synchronizedList(new LinkedList<WorldData>());
publicstaticqueue blockDestructionQueue=(Queue)Collections.synchronizedList(newlinkedlist());
我想知道为什么这不起作用

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

在正确答案第6段中

如果只有一个线程将内容放入队列,那么另一个线程 线程从队列中取出内容,ConcurrentLinkingQueue是 可能是杀伤力太大了。当你可能有几百甚至更多的时候 数千个线程同时访问队列。你的需要 可能会通过以下方式实现:

Queue<YourObject> queue = Collections.synchronizedList(new LinkedList<YourObject>());
Queue Queue=Collections.synchronizedList(新的LinkedList());
另外一个好处是它锁定了实例(队列),因此您可以 在队列上同步以确保复合操作的原子性(如 杰瑞德解释)。您不能使用ConcurrentLinkingQueue执行此操作, 因为所有操作都是在不锁定实例的情况下完成的(使用 java.util.concurrent.atomic变量)。您不需要这样做 如果要在队列为空时阻止,因为poll()将 只要在队列为空且poll()为原子时返回null即可。 检查poll()是否返回null。如果是,请等待(),然后重试 再一次。不用锁

其他信息:


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

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

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


集合。synchronizedList
返回不扩展
队列的
synchronizedList
的实例
LinkedList
是一个
队列
,但这不是您当时使用的。

正确的答案不一定完全正确。列表不是队列-为什么不使用LinkedBlockingQueue;它是为这种模式设计的。当列表为空时,使用者将阻止。我没有使用LinkedBlockingQueue的原因是由于他的帖子中所述的“正确”答案,其中LinkedBlockingQueue将比SyncronizedListI更密集。我尝试实现这一点,但在这一行出现以下错误多个标记-令牌上的语法错误“(”,此标记后应为表达式-标记“(”上的语法错误,此标记后应为表达式,带有公共静态阻止队列blockDestructionQueue=LinkedBlockingQueue();不要忘记关键字“new”,它非常(非常)重要。;)另外,一些新手建议-不要忘记对帮助你的答案进行投票,并接受回答你问题的答案。