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

时间:2015-05-27 12:30:25

标签: java multithreading thread-safety java-8 stringbuilder

我的代码:

StringBuilder sb = new StringBuilder();

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

我不关心最终结果中events.toString()的顺序。但是我担心events.toString()会正确地出现一行,当然没有混合/混乱。

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

3 个答案:

答案 0 :(得分:20)

更好的解决方案是使用

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

或者(感谢@Holger):

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

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

答案 1 :(得分:8)

不,它不是线程安全的。

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

这样做并不是很有用,即使您使用StringBuffer - 线程也必须等待彼此写入StringBuffer

答案 2 :(得分:4)

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

  

可变的字符序列。此类提供与StringBuffer兼容的API,但不保证同步

改为使用StringBuffer