介绍
StringBuffer是用于可变字符串的同步类。 使其同步的主要问题是
- 它通常用作局部变量,因此使其同步只会使其变慢。
- 以多线程方式使用它从来不是一个好主意。 这个问题是开发人员认为使用StringBuffer的方法在不使用时本身就是线程安全的。
StringBuffer的问题
这是来自真实类的示例,该类用于许多交易系统的生产中。 它不是一种常用的方法,但是您可能会认为StringBuffer为您提供了线程安全,而实际上却没有。
public void addProperty(String name, String value) {if (value != null && value.length() > 0) {if (sb.length() > 0) {sb.append(',');}sb.append(name).append('=').append(value);}}
尽管单个调用是线程安全的,但多个调用却不是。 要找到不涉及多个调用(包括toString)的StringBuffer的好用法,几乎是不可能的
一个难题
想象一下三个线程的调用(不分先后)
T1: addProperty("a", "b");
T2: addProperty("c", "d");
T3: sb.toString();
编写一个程序,该程序将生成T3的sb.toString()的所有可能输出(我发现是89)。出于线程安全的考虑,您可以将其减少到4。
注意
如果使用StringBuilder,情况会更糟,但是至少您可能不会认为方法不是线程安全的。 例如SimpleDateFormat使用StringBuffer
参考: 为什么我们的JCG合作伙伴 Peter Lawrey在Vanilla Java博客上从来没有一个同步StringBuffer的好主意 。
并发 2013-04-26
翻译自: https://www.javacodegeeks.com/2013/04/why-a-synchronized-stringbuffer-was-never-a-good-idea.html