HashMap Vs. ConcurrentHashMap Vs. SynchronizedMap – Bir HashMap Java'da Nasıl Senkronize Edilebilir

Yayınlanan: 2015-01-29

ConcurrentHashMap Vs Crunchify Senkronize Harita Örneği HashMap , Java'da çok güçlü bir veri yapısıdır. Her gün ve neredeyse tüm uygulamalarda kullanıyoruz. Daha önce Threadsafe önbelleğini nasıl uygulayabilirim, Hashmap'i Arraylist'e nasıl dönüştürebilirim üzerine yazdığım bir kaç örnek var.

Yukarıdaki her iki örnekte de Hashmap kullandık, ancak bunlar Hashmap'in oldukça basit kullanım durumlarıdır. HashMap is a non-synchronized koleksiyon sınıfıdır.

Aşağıdaki sorulardan herhangi biri var mı?

  • ConcurrentHashMap ve Collections.synchronizedMap(Map) arasındaki fark nedir?
  • Performans açısından ConcurrentHashMap ve Collections.synchronizedMap(Map) arasındaki fark nedir?
  • ConcurrentHashMap ve Collections.synchronizedMap() karşılaştırması
  • Popüler HashMap ve ConcurrentHashMap mülakat soruları

Bu derste, yukarıdaki tüm sorguları ve nedenini why and how ve neden senkronize edebileceğimizi gözden geçireceğiz.

Niye ya?

Map nesnesi, benzersiz bir tanımlama key ve eşlenmiş bir value birleşiminden oluşan öğeleri depolayan bir ilişkisel kapsayıcıdır. Farklı iş parçacıklarında anahtar değerini değiştirmek veya okumak isteyebileceğiniz çok yüksek eşzamanlı uygulamanız varsa, Concurrent Hashmap kullanmak idealdir. En iyi örnek, eşzamanlı okuma/yazma işlemlerini gerçekleştiren Üretici Tüketicidir.

Peki iş parçacığı güvenli Harita ne anlama geliyor? Birden multiple threads aynı anda bir karma haritaya erişirse ve iş parçacıklarından en az biri haritayı yapısal olarak değiştirirse, içeriğin tutarsız bir görünümünden kaçınmak için must be synchronized externally .

Nasıl?

HashMap'i senkronize etmenin iki yolu var

  1. Java Koleksiyonları synchronizedMap() yöntemi
  2. ConcurrentHashMap'i kullanın

EşzamanlıHashMap

  • Projenizde çok yüksek eşzamanlılığa ihtiyacınız olduğunda ConcurrentHashMap kullanmalısınız.
  • whole map senkronize etmeden iş parçacığı için güvenlidir.
  • Yazma bir kilitle yapılırken okumalar çok hızlı gerçekleşebilir.
  • Nesne düzeyinde kilitleme yoktur.
  • Kilitleme, hashmap kova düzeyinde çok daha ince bir ayrıntı düzeyindedir.
  • ConcurrentModificationException , bir iş parçacığı onu değiştirmeye çalışırken diğeri üzerinde yineleme yaparken ConcurrentModificationException oluşturmaz.
  • ConcurrentHashMap çok sayıda kilit kullanır.

SenkronizeHashMap

  • Nesne düzeyinde senkronizasyon.
  • Her okuma/yazma işleminin kilit alması gerekir.
  • Tüm koleksiyonu kilitlemek bir performans yüküdür.
  • Bu, esasen tüm haritaya yalnızca bir dizine erişim sağlar ve diğer tüm dizileri engeller.
  • Tartışmaya neden olabilir.
  • SynchronizedHashMap, eşzamanlı değişiklikte hızlı bir şekilde başarısız olan Iterator döndürür.

Şimdi koda bir göz atalım

  1. CrunchifyConcurrentHashMapVsSynchronizedHashMap.java sınıfı oluşturun
  2. Her HashTable, SynchronizedMap ve CrunchifyConcurrentHashMap için nesne oluşturun
  3. Haritadan 500 bin giriş ekleyin ve alın
  4. Başlangıç ​​ve bitiş zamanını ölçün ve zamanı milisaniye cinsinden görüntüleyin
  5. 5 threads paralel olarak çalıştırmak için ExecutorService kullanacağız

İşte bir Java kodu:

  • shutdown() , yürütücü hizmetin daha fazla gelen görevi almadığı anlamına gelir.
  • Bir kapatma isteğinden sonra awaitTermination() çağrılır.

Bu nedenle, önce serviceExecutor'ı kapatmanız ve ardından iş parçacıklarının bitmesini engellemeniz ve beklemeniz gerekir.

Eclipse Konsolu Sonucu: