评论者:mikera
这不应该有任何明显的并发影响:这种非常简单的方法不需要锁。大多数时间它仅仅是堆上的数组解锁读取,Java 内存模型足以保证正确的行为。这比 threadlocal 更便宜,例如,这里有一些证据表明这比 threadlocal 快 10-20 倍:[链接](http://stackoverflow.com/questions/609826/performance-of-threadlocal-variable)
至少,任何并发影响都非常小,将被经常避免 getMethods 调用的好处所抵消,这些调用成本很高。与 getMethods 相比的成本是几百纳秒(上表中的基准测试结果),而数组访问的成本只是几个纳秒。
我能想到的最糟糕的并发情况是两个不同的线程以高频率对不同的方法调用 getMethods,并且这些调用完美交织,以便始终使缓存失效。但即使在这种情况下,它可能也不会比当前代码有可测量的更糟糕。
@Vladimir 是的,instanceMethodCache 可以声明为 final。我猜这可能会对 JVM 有非常微小的帮助。
@Alex,我提出这个补丁是因为它与目前的情况相比是一个改进,我当然不认为它会成为“最佳解决方案”。在开源的精神和逐步推进的过程中,我希望您考虑接受它,即使这个问题仍然留到将来考虑。这也与 clj-1866 有关,我试图通过几种不同的方式来改进反射的“快速路径”。如果您更愿意看到一个包含大量改进的大补丁,我当然可以做到,我本以为较小的、更“明显”的补丁会更容易让您审查,但我愿意接受任何方式。