本文内容大多基于官方文档和网上前辈经验总结,经过个人实践加以整理积累,仅供参考。
首先需要明白什么是线程安全,什么是非线程安全,引用百度百科
关于 Java 中 String,StringBuffer 和 StringBuilder 的区别,参看:
Java:String,StringBuilder,StringBuffer 区别
下面用代码进行验证:
1 定义一个线程类,循环执行 StringBuffer 和 StringBuilder 的 append 方法,执行一次线程休眠 10 毫秒
class CustomThread extends Thread {
private StringBuffer buffer;
private StringBuilder builder;
public CustomThread(StringBuffer buffer, StringBuilder builder) {
this.buffer = buffer;
this.builder = builder;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
buffer.append("A");
builder.append("Z");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("StringBuffer Size:" + buffer.length()
+ " | "
+ "StringBuilder Size:" + builder.length());
}
}
2 定义测试方法,循环新建 10 个线程类并调用 start 方法
public static void main(String[] args) {
StringBuffer buffer = new StringBuffer();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 10; i++) {
new CustomThread(buffer, builder).start();
}
}
3 测试结果,10个线程,每个线程循环1000次,如果线程安全则全部执行完成后字符串长度应该都是 10 * 1000 = 10000,测试结果中显示 StringBuffer 最终长度的确是 10000,StringBuilder 最大长度只有9956,说明 StringBuilder 非线程安全