MST
星途 面试题库

面试题:Java中StringBuilder非线程安全在实际场景中的体现

请举例说明在多线程环境下,StringBuilder非线程安全可能会导致什么样的问题,并简单描述出现问题的原因。
20.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

问题举例

假设在多线程环境下,有多个线程同时对同一个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方法时,可能会发生以下情况:

  1. 多个线程同时获取到StringBuilder对象的当前状态。
  2. 每个线程都基于这个相同的状态进行修改操作,由于没有同步控制,这些修改操作可能会相互覆盖。例如,一个线程在执行append时可能还没来得及更新StringBuilder内部的字符数组和长度信息,另一个线程又开始基于旧的状态进行操作,导致部分字符添加操作丢失,从而最终得到的字符串长度小于预期值。