面试题答案
一键面试问题举例
假设在多线程环境下,有多个线程同时对同一个StringBuilder
对象进行操作,例如:
public class StringBuilderUnsafeExample {
private static StringBuilder sb = new StringBuilder();
public static void main(String[] args) {
Thread[] threads = new Thread[10];
for (int i = 0; i < 10; i++) {
threads[i] = new Thread(() -> {
for (int j = 0; j < 1000; j++) {
sb.append("a");
}
});
threads[i].start();
}
for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Length of StringBuilder: " + sb.length());
}
}
预期结果应该是10 * 1000 = 10000
,但实际运行多次会发现,输出的长度往往小于10000 。
原因描述
StringBuilder
不是线程安全的,是因为其方法没有同步机制。当多个线程同时调用append
方法时,可能会发生以下情况:
- 多个线程同时获取到
StringBuilder
对象的当前状态。 - 每个线程都基于这个相同的状态进行修改操作,由于没有同步控制,这些修改操作可能会相互覆盖。例如,一个线程在执行
append
时可能还没来得及更新StringBuilder
内部的字符数组和长度信息,另一个线程又开始基于旧的状态进行操作,导致部分字符添加操作丢失,从而最终得到的字符串长度小于预期值。