Wrapper sınıfını kullanma arasındaki fark nedir, SynchronizedMap
a HashMap
ve üzerindeConcurrentHashMap
?
Sadece HashMap
yineleme sırasında ( ConcurrentHashMap
) değiştirilebiliyor mu?
Wrapper sınıfını kullanma arasındaki fark nedir, SynchronizedMap
a HashMap
ve üzerindeConcurrentHashMap
?
Sadece HashMap
yineleme sırasında ( ConcurrentHashMap
) değiştirilebiliyor mu?
Yanıtlar:
Senkronize HashMap
:
Her yöntem bir nesne seviyesi kilidi kullanılarak senkronize edilir. Yani synchMap üzerinde get ve put yöntemleri bir kilit elde.
Tüm koleksiyonu kilitlemek bir performans yüküdür. Bir iş parçacığı kilidi tutarken, başka hiçbir iş parçacığı koleksiyonu kullanamaz.
ConcurrentHashMap
JDK 5'te tanıtıldı.
Nesne seviyesinde kilitleme yoktur, Kilitleme çok daha ince bir ayrıntıdadır. A için ConcurrentHashMap
, kilitler bir hashmap kovası seviyesinde olabilir.
Daha düşük seviyeli kilitlemenin etkisi, eşzamanlı koleksiyonlar için mümkün olmayan eşzamanlı okuyuculara ve yazıcılara sahip olmanızdır. Bu çok daha fazla ölçeklenebilirliğe yol açar.
ConcurrentHashMap
ConcurrentModificationException
bir iş parçacığı, başka bir iş parçacığı üzerinde yineleme yaparken değiştirmeye çalışırsa bir atmaz .
Bu makale Java 7: HashMap vs ConcurrentHashMap çok iyi bir okuma. Şiddetle tavsiye edilir.
ConcurrentHashMap
bireyin size()
sonuç güncel olabilir. size()
"Uygulamada Java Eşzamanlılığı" kitabına göre tam sayım yerine yaklaşık değer döndürme izni verilir. Bu yüzden bu yöntem dikkatle kullanılmalıdır.
Kısa cevap:
Her iki harita da Map
arabirimin iş parçacığı için güvenli uygulamalarıdır . ConcurrentHashMap
yüksek eşzamanlılığın beklendiği durumlarda daha yüksek verim için uygulanır.
Brian Goetz'in arkasındaki fikir hakkındaki makalesiConcurrentHashMap
çok iyi bir okuma. Şiddetle tavsiye edilir.
Map m = Collections.synchronizedMap(new HashMap(...));
docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
ConcurrentHashMap
tüm haritayı senkronize etmeden iş parçacığı için güvenlidir. Yazma bir kilitle yapılırken okumalar çok hızlı olabilir.
Hem ConcurrentHashMap hem de senkronizeHashmap kullanarak iplik güvenliğini sağlayabiliriz. Ancak mimarilerine bakarsanız çok fazla fark var.
Kilidi nesne seviyesinde tutacaktır. Yani put / get gibi herhangi bir işlem yapmak istiyorsanız, önce kilidi almanız gerekir. Aynı zamanda, diğer iş parçacıklarının herhangi bir işlem yapmasına izin verilmez. Yani bir seferde bu konuda sadece bir iplik çalışabilir. Yani burada bekleme süresi artacak. ConcurrentHashMap ile karşılaştırdığınızda performansın nispeten düşük olduğunu söyleyebiliriz.
Kilidi segment seviyesinde tutacaktır. 16 segmenti vardır ve varsayılan olarak eşzamanlılık seviyesini 16 olarak korur. Böylece, aynı anda 16 iş parçacığı ConcurrentHashMap üzerinde çalışabilir. Ayrıca, okuma işlemi bir kilit gerektirmez. Böylece herhangi bir sayıda iş parçacığı, üzerinde bir alma işlemi gerçekleştirebilir.
Eğer thread1 segment 2'de put operasyonu gerçekleştirmek istiyorsa ve thread2 segment 4 üzerinde put operasyonu yapmak istiyorsa, burada buna izin verilir. 16 iş parçacığı ConcurrentHashMap üzerinde bir kerede güncelleme (put / delete) işlemi gerçekleştirebilir.
Böylece bekleme süresi burada daha az olacaktır. Bu nedenle, performans senkronize edilmiş olandan daha iyidir.
Her ikisi de HashMap'in senkronize edilmiş versiyonudur ve temel işlevlerinde ve iç yapılarında farklılık vardır.
ConcurrentHashMap , bağımsız HashMaps Kavramsal olarak görüntülenebilen dahili segmentlerden oluşur. Bu tür tüm segmentler, yüksek eşzamanlı yürütmelerde ayrı dişler tarafından kilitlenebilir. Böylece, birden çok iş parçacığı birbirini engellemeden / beklemeden ConcurrentHashMap'ten anahtar / değer çiftlerini alabilir / koyabilir. Bu, daha yüksek verim için uygulanır.
buna karşılık
Collections.synchronizedMap () , HashMap'in senkronize bir sürümünü alırız ve engellenir şekilde erişilir. Bu, aynı anda birden çok iş parçacığı eşzamanlı Eşleme'ye erişmeye çalışırsa, eşzamanlı olarak anahtar / değer çiftlerini birer birer almasına / koymasına izin verileceği anlamına gelir.
ConcurrentHashMap
daha lock stripping
fazla paylaşılan erişime izin vermek için bilinen daha ince taneli kilitleme mekanizması kullanır . Bu nedenle daha iyi eşzamanlılık ve ölçeklenebilirlik sağlar .
Ayrıca için döndürülen yineleyiciler ConcurrentHashMap
olan zayıf tutarlı yerine hızlı tekniğini başarısız Senkronize HashMap kullandığı.
SynchronizedMap
Nesnenin üzerindeki kilidi tutma yöntemleri , oysa ConcurrentHashMap
kilitlerin içeriğin kovaları üzerinde tutulduğu bir "kilit şeritleme" kavramı vardır. Böylece ölçeklenebilirlik ve performans artırıldı.
ConcurrentHashMap:
1) Her iki harita da Harita arabiriminin iş parçacığı için güvenli uygulamalarıdır.
2) ConcurrentHashMap, yüksek eşzamanlılığın beklendiği durumlarda daha yüksek verim için uygulanır.
3) Nesne düzeyinde kilitleme yoktur.
Senkronize Karma Haritası:
1) Her yöntem bir nesne seviyesi kilidi kullanılarak senkronize edilir.
ConcurrentHashMap verilere eş zamanlı erişim sağlar. Tüm harita bölümlere ayrılmıştır.
Okuma işlemi yani. get(Object key)
segment düzeyinde bile senkronize edilmez.
Ancak yazma işlemleri yani. remove(Object key), get(Object key)
segment düzeyinde kilit elde eder. Haritanın yalnızca bir kısmı kilitli, diğer iş parçacıkları yine kilitli olanlar hariç çeşitli segmentlerdeki değerleri okuyabilir.
SynchronizedMap ise, nesne düzeyinde kilit elde edin. Tüm dişler çalışmadan bağımsız olarak güncel dişi beklemelidir (Okuma / Yazma).
ConcurrentHashMap vs Synchronized HashMap için basit bir performans testi
. Test akışı put
bir iş parçacığını çağırıyor get
ve Map
aynı anda üç iş parçacığını çağırıyor . @Trshiv'in dediği gibi ConcurrentHashMap, okuma işlemi kilitsiz olan için daha yüksek verim ve hıza sahiptir. Sonuç, çalışma süreleri bittiğinde 10^7
, ConcurrentHashMap, 2x
Senkronize HashMap'ten daha hızlıdır.
SynchronizedMap
ve ConcurrentHashMap
her ikisi de diş güvenli sınıfıdır ve çok iş parçacıklı uygulamada kullanılabilirler, aralarındaki temel fark iplik güvenliğini nasıl sağladıklarıdır.
SynchronizedMap
ederken edindiği tüm Harita örneğinde kilit ConcurrentHashMap
birden çok segmente ve kilitleme içine böler Harita örneği bu yapılır.
Java doc'in
Hashtable ve Collections.synchronizedMap (yeni HashMap ()) senkronize edilir. Ancak ConcurrentHashMap "eşzamanlı" dır.
Eşzamanlı bir koleksiyon iş parçacığı için güvenlidir, ancak tek bir dışlama kilidi tarafından yönetilmez.
Özel ConcurrentHashMap durumunda, herhangi bir sayıda eşzamanlı okumaya ve ayarlanabilir sayıda eşzamanlı yazma işlemine güvenli bir şekilde izin verir. "Senkronize" sınıflar, bir koleksiyona daha düşük ölçeklenebilirlik pahasına tek bir kilitle tüm erişimi önlemeniz gerektiğinde yararlı olabilir.
Birden fazla iş parçacığının ortak bir koleksiyona erişmesi beklenen diğer durumlarda, "eşzamanlı" versiyonlar normal olarak tercih edilir. Eşitlenmemiş koleksiyonlar, her iki koleksiyon da paylaşılmadığında veya yalnızca diğer kilitleri tutarken erişilebilir olduğunda tercih edilir.
Hashtable
ve arasındaki farkSynchronized HashMap
nedir?