【发布时间】:2018-03-04 12:56:56
【问题描述】:
在 scala 中创建线程安全的无限循环迭代器的正确方法是什么?似乎以下不是线程安全的(从迭代器上的多个线程同时迭代偶尔会抛出异常):
val map = Map(1->"one", 2->"two")
val iterator = Iterator.continually(map).flatten
您将如何更正此问题以使其成为线程安全的?
【问题讨论】:
-
迭代器不能真正成为线程安全的,因为 (1) 它是固有可变的,并且 (2) 使用运算符涉及调用两种不同的方法:
hasNext和next。同步这些方法不会有多大效果,因为在一个线程调用hasNext并确定它返回true之后,另一个线程可能会调用next,消耗当前值,这可能是最后一个值。所以第一个线程将调用next并抛出异常,因为迭代器是空的。迭代器绝对不是在多个线程之间共享的正确抽象。 -
那么你有什么建议?我需要每个访问集合的线程来获取下一个有效值。我还有哪些其他选择?
-
如果没有关于您的特定用例的太多信息,我会说可能使用类似
java.util.concurrent.ConcurrentLinkedQueue的例子。 -
我没有看到任何方法可以使其循环运行?
-
您可以在 synchronized way 中使用来自 ApacheCommons 的 CircularFifoBuffer
标签: scala