MST

星途 面试题库

面试题:Java中StringBuffer的reverse方法在源码层面如何保证线程安全

StringBuffer是线程安全的,以reverse方法为例,分析其在源码层面是如何确保多线程环境下操作的正确性,涉及哪些同步机制以及它们是怎样起作用的。
50.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

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