我得到了这个令人惊叹的结果,但我绝对不知道原因:
我有两种方法可以简化为:
private static final ConcurrentHashMap<Double,Boolean> mapBoolean =
new ConcurrentHashMap<Double, Boolean>();
private static final ConcurrentHashMap<Double,LinkedBlockingQueue<Runnable>> map
= new ConcurrentHashMap<Double, LinkedBlockingQueue<Runnable>>();
protected static <T> Future<T> execute(final Double id, Callable<T> call){
// where id is the ID number of each thread
synchronized(id)
{
mapBoolean.get();// then do something with the result
map.get();//the do somethign with the result
}
}
protected static <T> Future<T> executeLoosely(final Double id, Callable<T> call){
mapBoolean.get();// then do something with the result
map.get();//the do somethign with the result
}
}
在对超过 500 个线程进行分析时,每个线程调用上述每个方法 400 次,我发现execute(..) 的执行效果至少比executeLoosely(..) 好500 倍,这很奇怪,因为executeLoosely 不是同步的,因此更多线程可以同时处理代码。
有什么理由吗??
在我假设没有 500 个核心的机器上使用 500 个线程的开销,使用大约需要 100-1000 倍时间的任务,只要在 Map 上查找以执行 JVM 可以检测到的代码但不执行任何操作,可能会产生随机结果。 ;)
您可能遇到的另一个问题是,使用一个线程执行速度更快的测试可以从使用同步中受益,因为它会偏向对一个线程的访问。也就是说,它将您的多线程测试转回单线程测试,这首先是最快的。
您应该将获得的计时与执行循环的单个线程进行比较。如果这更快(我相信它会更快),那么它不是一个有用的多线程测试。
我的猜测是您在非同步代码之后运行同步代码。即 JVM 稍微预热之后。交换执行这些测试的顺序并多次运行它们,您将得到不同的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)