2013-08-28 12 views
15

Sto lavorando con circa 1000 elementi in concurrenthashmap. Il livello di concorrenza predefinito è 16. qualcuno può aiutarmi con qualche algoritmo o fattori da cui posso identificare il livello di concorrenza adatto al mio scenario o in che modo un livello di concorrenza influenza l'elaborazione di più thread.Come utilizzare e impostare il livello di concorrenza appropriatamente per ConcurrentHashMap?

ConcurrentHashMap<String, String> map=new ConcurrentHashMap<String, String>(500,1,20);    

20 è il mio livello di concorrenza (valore fittizio) .Need per impostare in modo efficiente

+0

Sapete quanti thread possono accedere contemporaneamente alla mappa? – rolve

+0

dipende dal numero di utente attualmente connesso al sistema. – csk

risposta

15

Secondo documenti:

La concorrenza consentito fra le operazioni di aggiornamento è guidato dal il concurrencyLevel costruttore opzionale argomento (predefinito 16), che viene utilizzato come suggerimento per il dimensionamento interno. La tabella è partizionata internamente per tentare di consentire il numero indicato di aggiornamenti simultanei senza contesa. Poiché il posizionamento nelle tabelle hash è essenzialmente casuale, la concorrenza effettiva sarà pari a .Idealmente, dovresti scegliere un valore per adattare altrettanti thread in modo da modificare la tabella contemporaneamente. L'utilizzo di un valore significativamente superiore rispetto a quello necessario può sprecare spazio e tempo, e un valore significativamente inferiore può portare a conflitti di thread.

quindi è necessario rispondere a 1 domanda:

Qual è il numero di thread che potrà mai contemporaneamente modificare la tabella?

+0

lascia considerare no di thread be 100 – csk

+1

Se la risposta è 100, è possibile impostare il livello di concorrenza su 100. – Tala

+0

@Tala Assumere che se il mio sistema ha 100 thread. E 90 thread attraverseranno questa mappa e al massimo 10 thread proveranno a modificare (mettere/rimuovere) questa mappa alla volta, quindi qual è il livello di concorrenza? Si prega di rispondere. –

1

16 è il numero predefinito di regioni in cui verrà suddivisa la mappa. ConcurrentHashMap, in caso di thread del lettore, viene eseguito (in quasi tutti i casi) senza blocco. Il numero di thread di scrittura è la cosa che devi preoccupare. E questo numero dovrebbe essere uguale al numero di regioni che hai.

2

ConcurrentHashMap consente a più lettori di leggere contemporaneamente senza alcun blocco. Ciò si ottiene partizionando la mappa in parti diverse in base al livello di concorrenza e bloccando solo una parte della mappa durante gli aggiornamenti. Il livello di concorrenza predefinito è 16 e, di conseguenza, Map è diviso in 16 parti e ciascuna parte è governata da un blocco diverso. Ciò significa che 16 thread possono operare su Map contemporaneamente, fino a quando non operano su una parte diversa della mappa. Ciò rende ConcurrentHashMap prestazioni elevate pur mantenendo intatta la sicurezza del thread.

3

Java 8:

Ora il ConcurrentHashMap non utilizza uno schema striatura blocco fisso affatto, invece ciascun segmento funge da “banda” utilizzando la sincronizzazione intrinseca.

Codice da fonte:

/** Implementation for put and putIfAbsent */ 
final V putVal(K key, V value, boolean onlyIfAbsent) { 
    ... 
    Node<K,V> f; int n, i, fh; 
    ... 
    else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) { 
    ... 
     synchronized (f) { 
      ... 
     } 
} 

e il costruttore ha il parametro appena usarlo come un suggerimento dimensioni come dicono i documenti.

concurrencyLevel: il numero stimato di thread di aggiornamento simultanei. L'implementazione può utilizzare questo valore come suggerimento per il dimensionamento.

E la fonte:

public ConcurrentHashMap(int initialCapacity, 
         float loadFactor, int concurrencyLevel) { 
    if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0) 
     throw new IllegalArgumentException(); 
    if (initialCapacity < concurrencyLevel) // Use at least as many bins 
     initialCapacity = concurrencyLevel; // as estimated threads 
    long size = (long)(1.0 + (long)initialCapacity/loadFactor); 
    int cap = (size >= (long)MAXIMUM_CAPACITY) ? 
     MAXIMUM_CAPACITY : tableSizeFor((int)size); 
    this.sizeCtl = cap; 
} 

Quindi non c'è bisogno di prendere in considerazione da soli, ConcurrentHashMap gestirà per voi.

+0

da commenti a java 8 Implementazione ConcurrentHashMap: – popalka

+0

Non vogliamo sprecare lo spazio necessario per associare un oggetto di blocco distinto a ciascun contenitore, quindi utilizzare il primo nodo di un elenco di contenitori stesso come blocco. Il blocco del supporto per questi blocchi si basa su monitor integrati "sincronizzati". – popalka

Problemi correlati