我最近在stackoverflow中提出了一个问题,然后找到了答案。最初的问题是,除了互斥锁或垃圾回收以外,还有哪些机制可以减慢我的多线程Java程序的速度?
我惊骇地发现HashMap已在JDK1.6和JDK1.7之间进行了修改。现在,它具有一个代码块,该代码块使所有创建HashMap的线程同步。
JDK1.7.0_10中的代码行是
/**A randomizing value associated with this instance that is applied to hash code of keys to make hash collisions harder to find. */
transient final int hashSeed = sun.misc.Hashing.randomHashSeed(this);
最终打电话
protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seed.compareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}
在其他JDK中,我发现JDK1.5.0_22或JDK1.6.0_26中不存在此功能。
对我的代码的影响是巨大的。这样一来,当我在64个线程上运行时,与在1个线程上运行时相比,性能将有所下降。JStack显示,大多数线程在Random的那个循环中花费了大部分时间。
所以我似乎有一些选择:
- 重写我的代码,以便我不使用HashMap,而是使用类似的东西
- 以某种方式弄乱了rt.jar,并替换了其中的哈希表
- 弄乱了类路径,所以每个线程都有自己的HashMap版本
在我开始这些路径中的任何一条(看起来都很耗时并且可能产生巨大影响)之前,我想知道是否错过了一个明显的技巧。堆栈中的所有人中有人可以建议哪条路更好,或者确定一个新想法。
谢谢您的帮助