ConcurrentHashMap ve Senkronize HashMap


148

Wrapper sınıfını kullanma arasındaki fark nedir, SynchronizedMap a HashMapve üzerindeConcurrentHashMap ?

Sadece HashMapyineleme sırasında ( ConcurrentHashMap) değiştirilebiliyor mu?

Yanıtlar:


120

Senkronize HashMap

  1. Her yöntem bir nesne seviyesi kilidi kullanılarak senkronize edilir. Yani synchMap üzerinde get ve put yöntemleri bir kilit elde.

  2. 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ı.

  1. Nesne seviyesinde kilitleme yoktur, Kilitleme çok daha ince bir ayrıntıdadır. A için ConcurrentHashMap, kilitler bir hashmap kovası seviyesinde olabilir.

  2. 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.

  3. ConcurrentHashMapConcurrentModificationExceptionbir 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.


7
Öyleyse Hashtableve arasındaki fark Synchronized HashMapnedir?
roottraveller

1
Bir ConcurrentHashMap ve Senkronize HashMap arasında hangisini önerirsiniz?
Blunderchips

2
O değer söz var ConcurrentHashMapbireyin 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.
Andrii Lisun

1
Hashtable ve Synchronized HashMap için @roottraveller stackoverflow.com/questions/8875680/…
Narendra Jaggi

89

Kısa cevap:

Her iki harita da Maparabirimin iş parçacığı için güvenli uygulamalarıdır . ConcurrentHashMapyü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.


1
O zaman bu ne? HashMap: Bu uygulamanın haritaya yanlışlıkla senkronize olmayan erişimi önlemek için senkronize edilmediğini unutmayın: Map m = Collections.synchronizedMap(new HashMap(...)); docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
X-

5
"Brian Goetz'in makalesi ... çok iyi bir okuma." - Ve dahası onun "Uygulamada Java Eşzamanlılığı" kitabı.
Alex Fedulov

31

ConcurrentHashMaptüm haritayı senkronize etmeden iş parçacığı için güvenlidir. Yazma bir kilitle yapılırken okumalar çok hızlı olabilir.


18

Hem ConcurrentHashMap hem de senkronizeHashmap kullanarak iplik güvenliğini sağlayabiliriz. Ancak mimarilerine bakarsanız çok fazla fark var.

  1. synchronisedHashmap

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.

  1. ConcurrentHashMap

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.


Çok güzel bir açıklama Çok teşekkürler
amoljdv06

11

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.


7

ConcurrentHashMapdaha lock strippingfazla 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 ConcurrentHashMapolan zayıf tutarlı yerine hızlı tekniğini başarısız Senkronize HashMap kullandığı.


3

SynchronizedMapNesnenin üzerindeki kilidi tutma yöntemleri , oysa ConcurrentHashMapkilitlerin içeriğin kovaları üzerinde tutulduğu bir "kilit şeritleme" kavramı vardır. Böylece ölçeklenebilirlik ve performans artırıldı.


2

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.


1

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).



1

SynchronizedMapve ConcurrentHashMapher 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.

SynchronizedMapederken edindiği tüm Harita örneğinde kilit ConcurrentHashMapbirden çok segmente ve kilitleme içine böler Harita örneği bu yapılır.

resim açıklamasını buraya girin

resim açıklamasını buraya girin


0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.