Tento článek vás seznámí s konceptem nazvaným Concurrent Hash Map In a navazuje na praktickou ukázku. Následující ukazatele budou popsány v tomto článku,
- Jak ConcurrentHashMap funguje interně?
- Proč jiná mapa?
- Jak je to jiné?
- Rozdíl mezi ConcurrentHashMap a HashMap
- Úskalí
Pokračujeme v tomto článku o souběžné hašovací mapě v Javě
Jak ConcurrentHashMap funguje interně?
Od prostředí Java 5 je ConcurrentHashMap představen jako alternativa pro HashTable. Můžeme také získat synchronizovanou mapu pomocí metody třídy nástrojů zvané synchronizedMap (), ale je tu nevýhoda této metody, tj. Velmi špatný výkon, protože k ní může přistupovat najednou pouze jedno vlákno. ConcurrentHashMap tedy řeší tyto problémy.
Pokračujeme v tomto článku o souběžné hašovací mapě v Javě
c ++ řadit pole ints
Proč jiná mapa?
I když již máme HashMap, HashTable, co je potřeba ConcurrentHashMap, je to proto, že poskytuje lepší výkon a zároveň je bezpečný pro vlákna.
Pokračujeme v tomto článku o souběžné hašovací mapě v Javě
Jak je to jiné?
Je také založen na hašování, ale jeho výkon je vylepšen strategií zamykání. Na rozdíl od HashTable nebo Synchronized HashMap neaplikuje stejný zámek na každou metodu, používá samostatný zámek pro každou metodu, Používá pro tento účel nový zámek. Podobně jako HashMap má ConcurrentHashMap 16 segmentů, tj. Segmentů, pro vytvoření ConcurrentHashMap s více než 16 segmenty má různé konstruktory.
Než budeme hovořit podrobně, projdeme si několik konceptů níže:
ConcurrentHashMap: Tato mapa umožňuje souběžný přístup podprocesu. Při přidávání nebo aktualizaci mapy se uzamkne pouze část mapy zvaná segment, tj. Podkladová datová struktura. Umožňuje souběžný přístup podprocesů ke čtení dat bez uzamčení. Byl zaveden za účelem zlepšení výkonu.
- Úroveň souběžnosti: Je to číslo, které je odhadovaným počtem souběžně aktualizovaných vláken.
- Faktor zatížení: Je to hodnota, která se používá k řízení faktoru změny velikosti.
- Počáteční kapacita: Jedná se o vlastnost, která vytváří mapu s uvedenou velikostí.
Podívejme se níže na diagram a pokusme se pochopit, jak ConcurrentHashMap funguje.
Takže ve výše uvedeném diagramu máme 16 zámků, které uzamykají pouze část mapy, která je požadována, takže k jiným metodám lze přistupovat pomocí různých vláken, což zlepšuje výkon.
Podobně jako HashMap, ConcurrentHashMap funguje podobným způsobem, obsahuje ve výchozím nastavení 16 segmentů a ukládá element hashováním, takže pokud mají prvky stejný hash, jsou uloženy ve stejném segmentu, jak je znázorněno na obrázku výše, pomocí propojeného seznamu.
Pokračujeme v tomto článku o souběžné hašovací mapě v Javě
Rozdíl mezi ConcurrentHashMap a HashMap
HashMap patří do sbírek, zatímco ConcurrentHashMap patří do souběžných sbírek, existuje však mezi nimi mnoho dalších rozdílů.
- ConcurrentHashMap jeBezpečné pro závit, tjsynchronizováno, ale HashMap není synchronizován.
- ConcurrentHashMap má nízký výkon, protože je synchronizován, protože někdy vlákna musí čekat, ale HashMap má vysoký výkon, protože je nesynchronizovaný a všechna vlákna k němu mohou přistupovat současně.
Získáme ConcurrentModificationException, pokud se dvě vlákna současně pokouší upravit nebo přidat obsah Object. V případě ConcurrentHashMap však při provádění stejné operace nezískáme žádnou výjimku.
Pro klíč a hodnoty v HashMap jsou povoleny hodnoty null, ConcurrentHashMap však nepovoluje hodnoty null pro klíč a hodnotu, kterou se pokusil přidat hodnotu null, dostaneme výjimku, tj. NullPointerException.
HashMap je představen v JDK 1.2, zatímco ConcurrentHashMap je představen v JDK 1.5.
Jak jsme viděli dříve, abychom dosáhli lepšího výkonu, skládá se z řady uzlů jako segmentů tabulky, které byly segmenty tabulky před Java 8 .
Kbelíky jsou líně inicializovány při prvním vložení. Každý segment lze uzamknout nezávisle uzamčením prvního uzlu segmentu a také operace čtení neblokují.
Ve srovnání s HashMap, ConcurrentHashMap poskytuje navíc úroveň souběžnosti argument pro řízení počtu odhadovaných vláken, která se mají použít.
Konstruktéři:
ConcurrentHashMap m = nový ConcurrentHashMap ()
jak psát tostring metodu v Javě
Je vytvořena nová prázdná mapa s výchozí počáteční kapacitou 16, faktorem zatížení 0,75 a úrovní souběžnosti 16.
ConcurrentHashMap m = nový ConcurrentHashMap (int initialCapacity)
Vytvoří se nová prázdná mapa se zadanou počáteční kapacitou, faktorem zatížení 0,75 a úrovní souběžnosti 16.ConcurrentHashMap m = nový ConcurrentHashMap (int initialCapacity, float loadFactor)
Je vytvořena nová prázdná mapa se zadanou počáteční kapacitou a faktorem zatížení s úrovní souběžnosti 16.
ConcurrentHashMap m = nový ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel)
Vytvoří se nová prázdná mapa se zadanou počáteční kapacitou, faktorem zatížení a úrovní souběžnosti.ConcurrentHashMap m = nový ConcurrentHashMap (mapa m)
Vytvoří nový ConcurrentHashMap z poskytnuté mapy.
Další dva argumenty: initialCapacity a loadFactor fungovaly stejně jako HashMap.
ConcurrentMap je paměť konzistentní pro operace klíč / hodnota v prostředí s více vlákny.
Pokračujeme v tomto článku o souběžné hašovací mapě v Javě
Úskalí
Zatímco načítání objektů ConcurrentHashMap není blokováno a může se překrývat s aktualizačními operacemi, pro lepší výkon tedy načítají pouze naposledy dokončené aktualizační operace.
Výsledky agregačních stavových metod včetně size, isEmpty a containsValue jsou obvykle užitečné pouze v případě, že mapa nepodléhá souběžným aktualizacím v jiných vláknech.
Pokud jsou souběžné aktualizace správně řízeny, mohou být tyto metody stavu spolehlivé.
Ačkoli tyto metody nezaručují v reálném čase.
Výchozí kapacita tabulky je 16, ale můžeme ji změnit pomocí úrovně souběžnosti.
public ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel) {// ... if (initialCapacityPokud jsou klíče klíčů požadovány v seřazeném pořadí, můžeme použít ConcurrentSkipListMap.
klady a zápory hackerstvíNyní po provedení výše uvedeného programu byste pochopili Concurrent Hash Map v Javě. Tak jsme se dostali na konec tohoto článku o Pokud se chcete dozvědět více, podívejte se na , důvěryhodná online vzdělávací společnost. Výcvikový a certifikační kurz Edureka Java J2EE a SOA je navržen tak, aby vás vyškolil jak pro základní, tak pro pokročilé koncepty Java spolu s různými rámci Java jako Hibernate & Spring.
Máte na nás dotaz? Uveďte to prosím v sekci komentářů tohoto článku a my se vám ozveme co nejdříve.