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