【发布时间】:2015-11-12 19:22:25
【问题描述】:
第一个线程不断地用对象填充集合。第二个线程需要遍历这些对象,但不会更改集合。
目前我使用Collection.synchronized 使其成为线程安全的,但有没有快速的方法?
更新
很简单:只要按下鼠标按钮,第一个线程(ui)就不断地将鼠标位置写入ArrayList。第二个线程(渲染)根据列表绘制一条线。
【问题讨论】:
-
如果您在没有显式同步的情况下对其进行迭代,即使同步列表也不是线程安全的。
-
你能找到一种方法让第二个线程只需要看到新对象吗?这样,您就可以使用阻塞队列将新数据传递给第二个线程。
-
也许可以查看持久数据结构。结构共享比同步或copyonwrite要好得多。
-
这听起来很像一个任务,您需要队列而不是列表,并且您将拥有 ConcurrentLinkedQueue,您无需担心锁定。
-
@jozzy,同步不仅仅是“接收最新数据”。从OP的问题来看,我们甚至不知道收集的种类,更不用说收集是如何实现的了。如果一个线程正在迭代集合,而另一个线程正在更新它,这完全有可能导致迭代线程看到集合处于无效状态,并导致程序崩溃。
标签: java multithreading collections synchronized java.util.concurrent