请问 StringJoiner
是否线程安全?
我知道 StringBuilder
和 StringBuffer
的区别,但找不到关于 StringJoiner
的信息。
请问 StringJoiner
是否线程安全?
我知道 StringBuilder
和 StringBuffer
的区别,但找不到关于 StringJoiner
的信息。
StringBuffer
方法(如 append()
)不同,StringJoiner
的方法(如 add()
)不是同步的。因此它不是 线程安全 的。
OpenJDK 的源代码:
StringJoiner
(字符串连接器)StringBuffer
(字符串缓冲区)StringJoiner :: merge
的方法,这个方法经常被忽略。它用于将两个StringJoiners通过两个单独的线程combine
在一起;当涉及多个线程时,流API在内部使用它。
因此,它根本不是线程安全的;但是可以用来合并两个不同的StringJoiner
。
StringJoiner
(在java.util
中)与StringBuilder
和StringBuffer
(两者都在java.lang
中)不同。 StringBuilder
和StringBuffer
作为字符串容器,您可以创建字符串,附加、插入和更新字符串。
但是,正如文档所说,StringJoiner
用于“构造由分隔符分隔的字符序列,并可选择以提供的前缀开头并以提供的后缀结尾。”
因此,仅支持此目的的方法可用。根据文档,该类不是线程安全的。
实际上,这个类的目的可以以线程安全的方式实现,因为它类似于util包中的实用程序类。
Joiner实例始终是不可变的;例如useForNull这样的配置方法对调用它的实例没有影响!您必须存储并使用方法返回的新joiner实例。这使得joiners线程安全,并且可以作为静态final常量存储。
请查看此链接。
StringJoiner
?这样做会使得你的字符串以任意顺序出现。 - Andy Turnerfinal static
,希望在调用其toString()方法多次之前预编译连接器逻辑。这通常是我们使用的java.util.regex.Pattern实例,它们恰好是线程安全的。 - YoYo