面试题答案
一键面试区别
- 线程安全:
StringBuffer
是线程安全的,其所有公开方法都被synchronized
关键字修饰。这意味着在多线程环境下,多个线程同时访问StringBuffer
的方法时,只有一个线程能够执行这些方法,从而保证了数据的一致性。StringBuilder
是非线程安全的,没有使用synchronized
关键字修饰方法。在多线程环境下,如果多个线程同时访问和修改StringBuilder
的内容,可能会导致数据不一致等问题。
- 性能:
- 由于
StringBuffer
的方法有同步开销,在单线程环境下或者不需要考虑线程安全的情况下,其性能不如StringBuilder
。因为StringBuilder
没有同步相关的操作,执行速度更快。 - 在多线程环境下,如果需要保证线程安全,
StringBuffer
虽然有同步开销,但能确保数据一致性,而StringBuilder
如果不进行额外的同步处理,则可能出现数据错误。
- 由于
- 适用场景:
StringBuffer
适用于多线程环境下需要对字符串进行频繁修改的场景,例如在多线程的日志记录模块中,需要保证日志记录的准确性和一致性时,可以使用StringBuffer
。StringBuilder
适用于单线程环境下对字符串进行频繁修改的场景,例如在一个只在主线程中执行的字符串拼接操作非常频繁的模块中,使用StringBuilder
能获得更好的性能。
StringBuffer线程同步原理
StringBuffer
的线程同步是通过synchronized
关键字实现的。例如append
方法:
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
当一个线程调用StringBuffer
的同步方法(如append
)时,它会首先获取该StringBuffer
对象的锁。如果此时其他线程也想调用这个同步方法,由于锁已经被占用,这些线程就会被阻塞,直到持有锁的线程执行完同步方法并释放锁,其他线程才有机会获取锁并执行同步方法。这样就保证了在多线程环境下,对StringBuffer
的操作是线程安全的。