面试题答案
一键面试1. 同步方法
StringBuffer
中的大多数方法,如append
、insert
、delete
等,都被声明为synchronized
方法。例如append
方法的源码:
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
这意味着当多个线程同时调用 StringBuffer
的这些方法时,同一时间只有一个线程能够执行这些方法,从而保证了线程安全。而 StringBuilder
的方法没有 synchronized
修饰,在多线程环境下调用这些方法可能会出现数据竞争问题。
2. 整体操作的原子性
由于方法被同步,对 StringBuffer
的操作在整体上是原子性的。例如,在多线程环境下执行多次 append
操作,StringBuffer
能确保每次 append
操作的完整性,不会出现部分数据丢失或数据不一致的情况。而 StringBuilder
在多线程环境下执行连续的操作时,可能会因为线程切换导致操作不完整。
3. 内存可见性
当一个线程对 StringBuffer
进行修改后,由于 synchronized
关键字的存在,会保证修改后的数据对其他线程是可见的。即其他线程能获取到最新的 StringBuffer
状态。而在 StringBuilder
中,由于没有同步机制,可能会出现一个线程修改了数据,但其他线程无法及时看到最新修改的情况。