Java一段代码证明StringBuilder是线程不安全的
时间: 2023-06-01 14:05:37 浏览: 96
以下是一段Java代码证明StringBuilder是线程不安全的:
```
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class StringBuilderThreadSafetyDemo {
private StringBuilder stringBuilder = new StringBuilder();
public void appendString(String string) {
stringBuilder.append(string);
}
public String toString() {
return stringBuilder.toString();
}
public static void main(String[] args) {
StringBuilderThreadSafetyDemo demo = new StringBuilderThreadSafetyDemo();
ExecutorService executorService = Executors.newFixedThreadPool(2);
for (int i = 0; i < 2; i++) {
executorService.submit(() -> {
for (int j = 0; j < 10000; j++) {
demo.appendString("a");
}
});
}
executorService.shutdown();
while (!executorService.isTerminated()) {}
System.out.println(demo.toString().length());
}
}
```
在这个例子中,我们创建了一个StringBuilderThreadSafetyDemo类,并在该类中定义了一个StringBuilder对象和一个appendString()方法用于向该对象中追加字符串。接着,我们使用了Java的并发编程工具ExecutorService创建了一个包含两个线程的线程池,并在每个线程中调用了10000次demo.appendString("a")来向StringBuilder对象中追加字符"a"。最后,我们打印了追加完所有字符后StringBuilder对象的长度。
如果StringBuilder是线程安全的,那么无论我们创建多少个线程并发地调用demo.appendString()方法,都不会影响StringBuilder对象的内容和长度。然而,运行上述代码后我们会发现,输出的字符串长度约为20000,而不是预期的10000,这意味着只有一个线程能够成功地向StringBuilder对象中添加字符"a",另一个线程的修改被覆盖了。这说明了StringBuilder是线程不安全的。
阅读全文