MST

星途 面试题库

面试题:Java中StringBuilder在多线程场景下的优化考量

在多线程环境中使用StringBuilder进行字符串频繁修改操作可能会出现什么问题?如果要在多线程环境下实现类似功能,你会如何改进?请结合代码示例说明。
39.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

问题

在多线程环境中使用StringBuilder进行字符串频繁修改操作可能会出现数据不一致问题。因为StringBuilder不是线程安全的,多个线程同时调用其方法(如append等)时,可能会导致最终结果不符合预期,比如字符顺序错乱、部分数据丢失等。

改进方法

可以使用StringBuffer,它是线程安全的,所有公开方法都是同步的。或者使用java.util.concurrent.atomic.AtomicReference结合StringBuilder来实现线程安全的字符串拼接。

代码示例

使用StringBuffer

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadSafeStringAppend {
    private static StringBuffer result = new StringBuffer();

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 10; i++) {
            executorService.submit(() -> {
                result.append("a");
            });
        }
        executorService.shutdown();
        while (!executorService.isTerminated()) {
        }
        System.out.println(result.toString());
    }
}

使用AtomicReference和StringBuilder

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicReference;

public class ThreadSafeStringAppendAtomic {
    private static AtomicReference<StringBuilder> atomicStringBuilder = new AtomicReference<>(new StringBuilder());

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 10; i++) {
            executorService.submit(() -> {
                StringBuilder localSb;
                do {
                    localSb = atomicStringBuilder.get();
                } while (!atomicStringBuilder.compareAndSet(localSb, localSb.append("a")));
            });
        }
        executorService.shutdown();
        while (!executorService.isTerminated()) {
        }
        System.out.println(atomicStringBuilder.get().toString());
    }
}