当我使用多线程情况下的groovy mixin函数时,大多数使用mixin线程出现块。
2.4.6
1.7
重现问题的一个小例子:
class ClassMixinTest {
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(100)
while (true) {
service.submit(new Runnable() {
@Override
void run() {
invoke()
}
})
service.submit()
}
}
static void invoke() {
ClassMixinTest.User user = new ClassMixinTest.User()
long start = System.nanoTime()
user.metaClass.mixin(ClassMixinTest.Man)
println("spend" + (System.nanoTime() - start))
}
static class User {
}
static class Man {
}
}
运行exmple ClassMixinTest
并使用jstack
线程堆栈进行分析,然后我们发现在mixin的实现中发生了大量的阻塞。
BLOCK发现发生在同一个地方:org.codehaus.groovy.vmplugin.v7.IndyInterface
当我在多个线程中使用mixin时,有没有人知道这个地方为什么要同步或者如何避免阻塞。