![stringbuffer](https://i-blog.csdnimg.cn/blog_migrate/d5bded8f12129b190adae1f5ca2bb594.png)
stringbuffer
介绍
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的所有可能输出(我发现89的sb.toString())。出于线程安全的考虑,您可以将其减少到4。
注意
如果使用StringBuilder,情况会更糟,但是至少您可能不会认为方法不是线程安全的。 例如SimpleDateFormat使用StringBuffer
并发2013-04-26
翻译自: https://www.javacodegeeks.com/2013/04/why-a-synchronized-stringbuffer-was-never-a-good-idea.html
stringbuffer