Jdk1 o HashMaps verildi.6 ve multi ile sorunlara neden yukarıda=, nasıl benim kod hazırlayayım parçacığı
Geçenlerde stackoverflow bir soru, cevabı buldum. İlk soru What mechanisms other than mutexs or garbage collection can slow my multi-threaded java program? oldu
HashMap JDK1 arasında modifed olmuştur benim korku keşfettim.Ve JDK1 6.7. Şimdi tüm iş parçacıklarını eşitleme HashMaps oluşturma neden olan kod bloğu vardır.
JDK1 kod satırı.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);
Arama sona erer
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));
}
Diğer JDKs bakarak, bu JDK1 mevcut değil buluyorum.5.0_22 veya JDK1.6.0_26.
Benim kod üzerinde etkisi büyüktür. 64 iş parçacığı üzerinde çalıştırdığımda, 1 iş parçacığı üzerinde koşarken daha az performans alıyorum bunu yapar. Bir JStack konuları en Rastgele bu döngü içinde iplik zamanlarının çoğunu gösterir.
Bazı seçenekler var gibi:
- HashMap kullanmıyorum, ama buna benzer bir şey kullanmak için kodu yeniden yazmak
- Eğer etrafta dağınık bir şekilde rt.jar ve içindeki hashmap değiştirin
- Sınıf bulaşmak her iş parçacığı HashMap kendi sürümü alır yani bir şekilde yolunu
Bu yollardan herhangi biri (zaman alıcı ve potansiyel olarak yüksek bak çok etkisi) başlamadan önce, eğer bariz bir oyunu özledim merak ettim. Eğer herhangi bir taşma insanlar daha iyi yol olduğu öneririm, ya da belki yeni bir fikir tanımlamak yığını olabilir.
Yardım için teşekkürler
CEVAP
7u6,#7118743 CR beliren yama orijinal yazarı değilim : Alternatif Karma tabanlı Haritalar ile Dize için Karma.
Sağ hashSeed başlatılması performans sorunu olduğunu ön kabul ediyorum ama tek başına Karma örnek Göster bir kez olur, çünkü bu bir sorun olması bekleniyor. Bu kodu bir darboğaz olmak için saniyede yüzlerce veya binlerce karma haritaları oluşturma olurdu. Bu kesinlikle normal değil. Yokgerçektenuygulama bunu yapmak için geçerli bir sebebi var mı? Ne zamandır bu karma haritalar yaşıyor?
Ne olursa olsun, muhtemelen cambecc önerdiği gibi yerine Rastgele ve tembel başlatma bazı varyant muhtemelen ThreadLocalRandom geçiş araştıracağız.
3 DÜZENLEMEK
Performans sorunu için bir düzeltme JDK7 güncelleme için cıva repo: itilmiş oldu
http://hg.openjdk.java.net/jdk7u/jdk7u-dev/jdk/rev/b03bbdef3a88
Düzeltme yaklaşan 7u40 sürümünün bir parçası olacak ve zaten İcedTea mevcut 2.4 bültenleri.
7u40 son test yapıları burada mevcuttur yakınlarındaki
https://jdk7.java.net/download.html
Geri bildirim hala karşılandı. 7 ** openJDK geliştiriciler tarafından görüldüğü alır emin olmak için gönderin.
Nasıl geçerli Gıt benim şubesinden (iz...
Nasıl gıt iptalleri için benim tercihi...
Nasıl pi benim hesaplama doğru olup ol...
Neden benim program tam olarak 8192 el...
Nasıl Android bir URL açmak'benim...