“StringBuilders不是线程安全的”是什么意思?

我已经阅读了一些关于Java编程语言的优缺点的文章。在其中一篇文章中,作者提到:StringStringBuilder

StringBuilder不是线程安全的,因此在多个线程中使用StringBuffer

不幸的是,我无法理解它是什么意思。您能解释一下 之间的区别吗,特别是在“线程安全”的上下文中。StringStringBuilderStringBuffer

如果您能用代码示例描述,我将不胜感激。


答案 1

如果多个线程正在修改 的同一实例,则结果可能是意外的 - 即某些修改可能会丢失。这就是为什么你应该在这种情况下使用StringBuffer。但是,如果每个线程实例只能由一个线程修改,则最好使用 ,因为它会更有效(线程安全会带来性能成本)。StringBuilderStringBuilderStringBuilder


答案 2

如果多个线程尝试更改 StringBuilder 对象值,则结果将很奇怪。请参阅下面的示例,

private StringBuilder sb = new StringBuilder("1=2");

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);
    }
}

如果许多线程调用addProperty方法,那么结果将是奇怪的(不可预测的结果)。

Thread1: addProperty("a", "b");
Thread2: addProperty("c", "d");
Thread3: addProperty("e", "f");

最后,当您调用sb.toString()时,结果将是不可预测的。例如,它可能会带来类似 的输出,但您的期望是1=2,ac=d=b,e=f1=2,a=b,c=d,e=f