代码示例展示StringBuilder 与 StringBuffer 的在线程安全的差异不通过长度
时间: 2024-02-25 21:57:04 浏览: 17
好的,以下是代码示例:
```java
public class StringBuilderVsStringBuffer {
public static void main(String[] args) throws InterruptedException {
StringBuilder stringBuilder = new StringBuilder();
StringBuffer stringBuffer = new StringBuffer();
Runnable task = () -> {
for (int i = 0; i < 10000; i++) {
stringBuilder.append("a");
stringBuffer.append("a");
}
};
Thread thread1 = new Thread(task);
Thread thread2 = new Thread(task);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.println("StringBuilder length: " + stringBuilder.length()); // 20000
System.out.println("StringBuffer length: " + stringBuffer.length()); // 20000
}
}
```
在这个例子中,我们创建了两个字符串变量:`stringBuilder` 和 `stringBuffer`。然后,我们创建了一个任务,该任务会向这两个变量追加10000个字符。我们将该任务分配给两个不同的线程,每个线程都会执行该任务。最后,我们等待两个线程完成,然后打印出每个变量的长度。
由于 `StringBuilder` 不是线程安全的,因此在多线程环境下,如果两个线程同时执行追加操作,可能会导致数据不一致的问题。因此,我们可以看到,`StringBuilder` 的长度可能小于20000。
而 `StringBuffer` 是线程安全的,因此在多线程环境下,即使两个线程同时执行追加操作,也不会有数据不一致的问题。因此,我们可以看到,`StringBuffer` 的长度总是为20000。