面试题答案
一键面试StringBuffer
的reverse
方法源码:public synchronized StringBuffer reverse() { toStringCache = null; super.reverse(); return this; }
- 同步机制及作用:
synchronized
关键字:StringBuffer
的reverse
方法使用了synchronized
关键字进行修饰。这使得在多线程环境下,当一个线程进入reverse
方法时,会获取StringBuffer
实例对象的锁。- 其他线程如果也尝试进入
reverse
方法,由于锁已经被占用,它们会被阻塞,直到当前持有锁的线程执行完reverse
方法并释放锁。这样就保证了同一时间只有一个线程能够执行reverse
方法,从而避免了多线程同时操作StringBuffer
内部状态可能导致的数据不一致问题。
toStringCache
变量处理:- 在
reverse
方法中,首先将toStringCache
设置为null
。toStringCache
是StringBuffer
类中的一个缓存变量,用于缓存toString
方法的结果。在多线程环境下,如果不将其设置为null
,可能会出现缓存不一致的情况。例如,一个线程执行reverse
操作后,缓存的字符串内容已经与实际内容不同,但其他线程可能仍使用旧的缓存。通过将其设置为null
,后续调用toString
方法时会重新生成正确的字符串,保证了数据的一致性。
- 在
- 调用父类
AbstractStringBuilder
的reverse
方法:super.reverse()
调用的是AbstractStringBuilder
类中的reverse
方法,该方法实现了实际的字符反转逻辑。由于StringBuffer
的reverse
方法被synchronized
修饰,所以在调用父类reverse
方法时,也在同步的保护范围内,避免了多线程同时修改AbstractStringBuilder
内部字符数组等状态造成的错误。