Java的StringJoiner是线程安全的吗?

7

请问 StringJoiner 是否线程安全?

我知道 StringBuilderStringBuffer 的区别,但找不到关于 StringJoiner 的信息。


1
你检查过源代码了吗? - Scary Wombat
从源代码来看,它似乎不是线程安全的。 - ernest_k
3
你是否想在多个线程中使用StringJoiner?这样做会使得你的字符串以任意顺序出现。 - Andy Turner
@AndyTurner,这在例如servlet中使用时确实是一个问题。可以将StringJoiner定义为final static,希望在调用其toString()方法多次之前预编译连接器逻辑。这通常是我们使用的java.util.regex.Pattern实例,它们恰好是线程安全的。 - YoYo
显示剩余2条评论
4个回答

8

2
文档中没有任何线程安全属性的信息。但是,它有一个类似于StringJoiner :: merge的方法,这个方法经常被忽略。它用于将两个StringJoiners通过两个单独的线程combine在一起;当涉及多个线程时,流API在内部使用它。

因此,它根本不是线程安全的;但是可以用来合并两个不同的StringJoiner


0

StringJoiner(在java.util中)与StringBuilderStringBuffer(两者都在java.lang中)不同。 StringBuilderStringBuffer作为字符串容器,您可以创建字符串,附加、插入和更新字符串。

但是,正如文档所说,StringJoiner用于“构造由分隔符分隔的字符序列,并可选择以提供的前缀开头并以提供的后缀结尾。”

因此,仅支持此目的的方法可用。根据文档,该类不是线程安全的。

实际上,这个类的目的可以以线程安全的方式实现,因为它类似于util包中的实用程序类。


-4

Joiner实例始终是不可变的;例如useForNull这样的配置方法对调用它的实例没有影响!您必须存储并使用方法返回的新joiner实例。这使得joiners线程安全,并且可以作为静态final常量存储。

请查看此链接。

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=2ahUKEwimhb-1mrLdAhUZfd4KHbsfCBAQFjABegQICxAE&url=https%3A%2F%2Fgoogle.github.io%2Fguava%2Freleases%2F19.0%2Fapi%2Fdocs%2Fcom%2Fgoogle%2Fcommon%2Fbase%2FJoiner.html&usg=AOvVaw0iHPRevkI6TS31IUFmBkQc


4
我认为 PO 在谈论 Java 标准库,而不是第三方库。因此,对其进行了投反对票。 - xiaofeng.li
java.util.StringJoiner不是guava Joiner。 - Lucas Ross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接