Domanda

I stava leggendo l'articolo " Java teoria e pratica: costruzione di una migliore HashMap " che dà una panoramica eccellente circa l'attuazione del ConcurrentHashMap.

Ho anche trovato alcune discussioni su di esso su StackOverflow qui .

domanda che se ho avuto nella mia mente è "Quali sono gli scenari / applicazioni / luoghi" in cui viene utilizzato ConcurrentHashMap.

Grazie

È stato utile?

Soluzione

Io lo uso per la ricerca rapida da ID utente agli oggetti utente in un server multi-threaded per esempio.

Ho una rete-thread, un thread del timer per le attività periodiche e un filo per la gestione di input della console. Più thread accedere alla mappa di hash di utenti, quindi ha bisogno di essere thread-safe.

Altri suggerimenti

Si potrebbe utilizzare un ConcurrentHashMap negli stessi casi si usa un HashMap, salvo che si ha intenzione di più di un thread utilizzando la mappa.

Utilizzando ConcurrentHashMap è raccomandato per i grandi Maps o gran numero di operazioni di lettura e scrittura a causa di:

  • Durante la lettura dalla mappa, non è chiusa a chiave. Così, se 5 fili sono la lettura da esso, tutti possono leggere contemporaneamente da carta.
  • Nella scrittura, solo il record in questione (chiave) è bloccata. Pertanto, se 5 fili stanno scrivendo valori delle chiavi diverse, tutte quelle operazioni possono avvenire simultaneamente. Tuttavia, se 2 fili stanno scrivendo stessa chiave, tali operazioni sono thread-safe. Questo accade perché non c'è blocco a livello (mappa) oggetto, ma ad una granularità più fine molto -. A livello HashMap secchio

Si consideri il seguente esempio:

public class ConcurrentHashMapExample {

    public static void main(String[] args) {

        //ConcurrentHashMap
        Map<String,String> myMap = new ConcurrentHashMap<String,String>();
        myMap.put("1", "1");
        myMap.put("2", "1");
        myMap.put("3", "1");
        myMap.put("4", "1");
        myMap.put("5", "1");
        myMap.put("6", "1");
        System.out.println("ConcurrentHashMap before iterator: "+myMap);
        Iterator<String> itr1 = myMap.keySet().iterator();

        while(itr1.hasNext()){
            String key = itr1.next();
            if(key.equals("3")) myMap.put(key+"new", "new3");
        }
        System.out.println("ConcurrentHashMap after iterator: "+myMap);

        //HashMap
        myMap = new HashMap<String,String>();
        myMap.put("1", "1");
        myMap.put("2", "1");
        myMap.put("3", "1");
        myMap.put("4", "1");
        myMap.put("5", "1");
        myMap.put("6", "1");
        System.out.println("HashMap before iterator: "+myMap);
        Iterator<String> itr2 = myMap.keySet().iterator();

        while(itr2.hasNext()){
            String key = itr2.next();
            if(key.equals("3")) myMap.put(key+"new", "new3");
        }
        System.out.println("HashMap after iterator: "+myMap);
    }
}

L'output sarà:

ConcurrentHashMap before iterator: {1=1, 5=1, 6=1, 3=1, 4=1, 2=1}
ConcurrentHashMap after iterator: {1=1, 3new=new3, 5=1, 6=1, 3=1, 4=1, 2=1}
HashMap before iterator: {3=1, 2=1, 1=1, 6=1, 5=1, 4=1}
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
    at java.util.HashMap$KeyIterator.next(HashMap.java:828)
    at com.test.ConcurrentHashMapExample.main(ConcurrentHashMapExample.java:44)

Come si può vedere, per la HashMap un ConcurrentModificationException sarà gettato perché si cerca di modificare una mappa che attualmente iterazione su! (In particolare, l'eccezione sarà gettato sulla dichiarazione: String key = itr1.next();)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top