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

我的代码:

StringBuilder sb = new StringBuilder();

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

我不在乎最终结果中的顺序。但我在乎会正确出现一行又一行,当然不会混合/混乱。events.toString()events.toString()

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


答案 1

更好的解决方案是使用

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

或者(感谢@Holger):

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

通常避免用作流的终端操作。通常减少操作喜欢或是更好的选择。forEachcollectreduce


答案 2

不,它不是线程安全的。

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

这样做并不是很有用,即使您会改用 - 线程必须等待彼此才能写入 .StringBufferStringBuffer