【问题标题】:Synchronizing ArrayList of BlockingQueues同步 BlockingQueues 的 ArrayList
【发布时间】:2013-04-17 21:16:28
【问题描述】:
在 Java 中,我需要一个对象,它是 60 个LinkedBlockingQueues 的ArrayList。 ArrayList 在程序开始时将 .add() 60 LinkedBlockingQueues,同时仍然是单线程的。然后一个线程将.add() 发送到LinkedBlockingQueues,而另一个线程将.poll()。是否需要显式同步这个对象?
【问题讨论】:
标签:
java
multithreading
arraylist
synchronization
blockingqueue
【解决方案1】:
不,如果列表在初始化后没有被修改,那么你不需要同步它。我建议您使用 UnmodifiableList 而不是 ArrayList - 如果有人在初始化后尝试修改列表,您将收到运行时异常,这比竞争条件更可取。
【解决方案2】:
是否需要显式同步这个对象?
如果您在完成List 构建之后 分叉线程,那么您就可以了。但是,如果它是真正不可变的,我会使用数组而不是 Collection。你可以这样做:
BlockingQueue[] blockingQueueArray =
blockingQueueList.toArray(new BlockingQueue[blockingQueueList.size()]);