StringBuffer的结果就能预测吗?
时间: 2024-03-11 22:51:15 浏览: 7
StringBuffer 是线程安全的,因为它的方法都使用了 synchronized 关键字进行同步,所以在多线程环境中使用 StringBuffer 进行字符串拼接操作是安全的。但是,StringBuffer 的结果也不一定能够完全预测,这是因为多线程环境下,线程之间的执行顺序是不确定的,可能会出现多个线程同时对同一个 StringBuffer 进行操作的情况,导致结果不可预测。例如:
```
public class StringBufferTest implements Runnable {
private StringBuffer stringBuffer;
public StringBufferTest(StringBuffer stringBuffer) {
this.stringBuffer = stringBuffer;
}
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
stringBuffer.append("a");
}
}
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer();
Thread thread1 = new Thread(new StringBufferTest(stringBuffer));
Thread thread2 = new Thread(new StringBufferTest(stringBuffer));
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(stringBuffer.length());
}
}
```
以上代码创建了两个线程,分别对同一个 StringBuffer 实例进行 10000 次字符串拼接操作,最终输出字符长度。由于 StringBuffer 线程安全,两个线程对同一个实例进行操作时,不会出现多线程竞争的情况,但是由于线程执行顺序的不确定性,最终的结果也不一定能够完全预测。例如,当线程 1 执行完 5000 次字符串拼接后,线程 2 开始执行,线程 1 和线程 2 交替执行,最终的结果可能是 10000,也可能是大于 10000。因此,在多线程环境中,使用 StringBuffer 进行字符串拼接操作时,也需要注意结果的不确定性。