面试题答案
一键面试问题
在多线程环境中使用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());
}
}