代码示例展示StringBuilder 与 StringBuffer 的在线程安全的差异
时间: 2023-08-23 22:20:40 浏览: 97
下面是一个简单的代码示例,用于展示 StringBuilder 和 StringBuffer 在线程安全上的差异:
```java
public class ThreadSafeTest {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
StringBuffer stringBuffer = new StringBuffer();
int n = 10000;
// 使用 StringBuilder 进行多线程操作
Runnable runnable1 = () -> {
for (int i = 0; i < n; i++) {
sb.append("hello");
}
};
Thread thread1 = new Thread(runnable1);
Thread thread2 = new Thread(runnable1);
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("StringBuilder:" + sb.length());
// 使用 StringBuffer 进行多线程操作
Runnable runnable2 = () -> {
for (int i = 0; i < n; i++) {
stringBuffer.append("hello");
}
};
Thread thread3 = new Thread(runnable2);
Thread thread4 = new Thread(runnable2);
thread3.start();
thread4.start();
try {
thread3.join();
thread4.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("StringBuffer:" + stringBuffer.length());
}
}
```
在上面的示例中,我们分别使用 StringBuilder 和 StringBuffer 进行了多线程字符串拼接的操作,并记录了其结果。经测试,使用 StringBuilder 进行多线程操作时,由于其非线程安全,多个线程同时对其进行操作会导致数据丢失,最终得到的结果长度可能小于预期。而使用 StringBuffer 进行多线程操作时,由于其线程安全,多个线程同时对其进行操作也不会导致数据丢失,最终得到的结果长度与预期相同。
因此,在多线程环境下,应该使用 StringBuffer 来进行字符串拼接操作,以保证数据的正确性。
阅读全文