Вы можете использовать ConcurrentLinkedQueue
из Java. Следующее решение поддерживает параллелизм таким образом, что если вы добавляете объекты при извлечении истории, они будут добавлены в историю и в результат текущего вызова. Однако в этом решении они читаются один раз. Если вам нужно прекратить добавление во время получения истории, мы можем подумать о другом решении. Рассмотрите возможность использования класса History следующим образом:
case class History() {
private val _events = new ConcurrentLinkedQueue[Event]()
def add(event: Event): Unit = _events.add(event)
def events: List[Event] = {
if (_events.isEmpty) {
List()
} else {
_events.poll() +: events
}
}
}
Затем, при выполнении следующего кода:
def main(args: Array[String]): Unit = {
val h = History()
List(
Event(10),
Event(20),
Event(30)
).foreach(h.add)
println(s"Events are: ${h.events.mkString(", ")}")
println(s"Events are: ${h.events.mkString(", ")}")
}
Результат:
Events are: Event(10), Event(20), Event(30)
Events are:
Process finished with exit code 0