被同步的StringBuffer方法的用途是什么。当一个线程在更改字符串缓冲区时,其他线程则无法实际应用和使用
答案 0 :(得分:2)
我认为线程安全是对正确性(避免未定义行为)的优化。在多线程环境中,至少通过线程安全使用StringBuffer
(从无竞争条件或未同步访问的角度来看,这是正确的)
字符串缓冲区可安全用于多个线程。
这可能会或可能不会影响您的性能成本。
如果您不需要线程安全,即您处于单线程环境中,或者该字符串在单个函数调用本地,则看起来您可以使用未同步的StringBuilder
。 / p>
答案 1 :(得分:2)
StringBuffer
的实际应用和用途是什么?
几乎没有,这就是为什么将其替换为StringBuilder
的原因。
这是过去的遗留类,它不被弃用,因为有很多代码在使用它。
例如即使在Java 1.5中添加了StringBuilder
,但在Java 1.4中添加了正则表达式类Matcher
,直到Java 9才获得StringBuilder
的支持(请参见appendReplacement
)
正如Javadoc所说:
从JDK 5版本开始,该类已经添加了一个等效类,该类旨在供单个线程
StringBuilder
使用。StringBuilder
类通常应优先于此类使用,因为它支持所有相同的操作,但是它更快,因为它不执行同步。
答案 2 :(得分:0)
字符串缓冲区可以安全地用于多线程应用程序中,因为它在多线程环境中不会造成数据不一致。
示例:当我有一个字符串构建器,其初始值为“ Java”,并且如果thread1尝试将“ is”添加到String builder中,则thread2试图添加“ supported”,则有可能该字符串构建器可能会变成“ Java is”或“支持Java”或“支持Java”,从而导致数据不一致。
如果使用字符串缓冲区,如果线程1试图添加“是”,则线程2将等待,因此只能变为“支持Java”
答案 3 :(得分:-1)
StringBuffer,如果您有一个对象,其值可以由多个线程更改和修改。因此,字符串缓冲区中的同步将有助于进行多次更改。