举个例子说明StringBuilder的线程不安全
时间: 2023-08-23 20:30:30 浏览: 95
StringBuilder 是非线程安全的,因为它的方法没有同步(synchronized)关键字修饰,多个线程同时访问同一个 StringBuilder 实例时可能会产生线程安全问题。举个例子:
```
public class StringBuilderTest implements Runnable {
private StringBuilder stringBuilder;
public StringBuilderTest(StringBuilder stringBuilder) {
this.stringBuilder = stringBuilder;
}
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
stringBuilder.append("a");
}
}
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder();
Thread thread1 = new Thread(new StringBuilderTest(stringBuilder));
Thread thread2 = new Thread(new StringBuilderTest(stringBuilder));
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(stringBuilder.length());
}
}
```
以上代码创建了两个线程,分别对同一个 StringBuilder 实例进行 10000 次字符串拼接操作,最终输出字符长度。由于 StringBuilder 非线程安全,当两个线程同时对同一个实例进行操作时,可能会出现多线程竞争的情况,导致结果不可预测。运行多次后,我们会发现输出的字符长度不是固定的,而且往往比预期的要大,这就是线程安全问题的体现。因此,在多线程环境中,应该使用线程安全的 StringBuffer 来进行字符串拼接操作。
阅读全文