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”,它非常(非常)重要。;)另外,一些新手建议-不要忘记对帮助你的答案进行投票,并接受回答你问题的答案。