StringBuilder 是线程安全的(与 parallelStream 一起使用)吗?

Is StringBuilder threadsafe (using it with parallelStream)?

我的代码:

StringBuilder sb = new StringBuilder();

events.parallelStream().forEach(event -> {
    sb.append(event.toString());
    sb.append("\n");
});

我不关心 events.toString() 在最终结果中的顺序。但我关心 events.toString() 会正确地一行一行地显示,当然不会混淆/搞乱。

parallelStream(而不是 stream)在这方面安全吗?

不,不是。如 its javadoc 中所述:

A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with no guarantee of synchronization.

改用StringBuffer

更好的解决方案是使用

events.parallelStream().map(event -> event+"\n").collect(Collectors.joining());

或者(感谢@Holger):

events.parallelStream().map(Object::toString).collect(Collectors.joining("\n", "", "\n"));

通常避免使用 forEach 作为流的终端操作。通常像 collectreduce 这样的缩减操作是更好的选择。

不,它不是线程安全的。

这是旧 StringBuffer 和新 StringBuilder 之间的主要区别 - 前者的方法是同步的,而后者不是。

这样做不是很有用,即使您改用 StringBuffer - 线程将不得不相互等待以写入 StringBuffer.