MutableCallSite.syncAll中FIXME: NYI是否代表功能尚未实现?
MutableCallSite.syncAll 核心实现与行为答疑
核心结论前置
你观察到的Java层MutableCallSite.syncAll方法的占位代码与// FIXME: NYI注释属于历史遗留的误导性内容,该方法的核心逻辑完全由JVM底层内置实现,功能完全符合官方Javadoc的规范约定,不存在功能缺失问题。
具体问题解答
1. 为什么Java层代码看起来没有实现核心功能?
java.lang.invoke包下的大量核心API都属于JVM固有方法(Intrinsic Method):
- 运行时不会执行你看到的Java层桩代码,而是直接调用JVM内置的底层逻辑,Java层代码仅作为声明占位、参数校验用。
- 你看到的私有
AtomicInteger的lazySet操作是配合JVM底层内存屏障逻辑的标记,并非无意义代码,参数校验是Java层唯一需要执行的前置逻辑。
2. 方法的实际行为是否符合Javadoc描述?
完全符合,以下是明确的行为约定:
syncAll返回后,所有后续读取传入MutableCallSite目标的线程,一定能获取到最新写入的值,不存在读到旧值的可能。- 文档中提到的「可能阻塞」并非必然行为:如果JVM检测到当前没有其他线程缓存了旧的调用站点目标,会直接返回,仅当存在大量线程持有旧目标缓存的场景下,才会阻塞等待所有缓存失效。
- JMM相关的补充表述是严谨性说明,和前面的承诺不冲突:如果其他线程在
syncAll执行完成前就已经完成了目标读取,自然只能拿到旧值,只有syncAll返回后执行的读取操作才能保证拿到最新值。
3. Android移除该方法的处理是否正确?
该处理不符合Java规范要求。Android的ART虚拟机没有实现MutableCallSite相关的底层固有方法,才会误判该方法未实现而将其移除,这直接导致ART环境下的MutableCallSite和SwitchPoint无法满足Java规范的可见性承诺,也导致Nashorn、JRuby等依赖该特性的动态语言实现无法在Android上正常运行。
4. 遗留注释是否应该清理?
// FIXME: NYI是Java 7时期该功能开发阶段留下的临时注释,后续功能开发完成后一直没有清理,属于OpenJDK源码的小瑕疵,确实应该移除,替换为「本方法为JVM固有方法,核心逻辑由虚拟机底层实现」的说明。
内容的提问来源于stack exchange,提问作者Chapman Flack
相关产品推荐
相关产品推荐

