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
作为流的终端操作。通常像 collect
或 reduce
这样的缩减操作是更好的选择。
不,它不是线程安全的。
这是旧 StringBuffer
和新 StringBuilder
之间的主要区别 - 前者的方法是同步的,而后者不是。
这样做不是很有用,即使您改用 StringBuffer
- 线程将不得不相互等待以写入 StringBuffer
.
我的代码:
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
作为流的终端操作。通常像 collect
或 reduce
这样的缩减操作是更好的选择。
不,它不是线程安全的。
这是旧 StringBuffer
和新 StringBuilder
之间的主要区别 - 前者的方法是同步的,而后者不是。
这样做不是很有用,即使您改用 StringBuffer
- 线程将不得不相互等待以写入 StringBuffer
.