2013-04-19 17 views
10

Sto cercando di trovare una risposta a questi, ma non riesco a trovarlo su Google o nei documenti Java.ConcurrentHashMap leggere e scrivere blocchi

Caso 1: in ConcurrentHashMap, supponiamo che un filo t1 sta leggendo dal segmento n, e allo stesso un altro thread t2 voler scrivere sul stesso segmento n:

Domanda 1: queste due operazioni saranno una dopo l'altra oppure verranno eseguite simultaneamente?


Caso 2: in ConcurrentHashMap, supponiamo che un filo t1 sta scrivendo su segmento n, e allo stesso un altro thread t2 vuole leggere dal segmento stesso n,

Domanda 2: queste due operazioni saranno una dopo l'altra oppure verranno eseguite contemporaneamente?

+0

hi..haightighted le domande –

+0

Quindi cosa intendi tra ConcurrentHashMap e ReadWriteLock? –

risposta

17

Penso risposte javadoc entrambe le domande:

operazioni di recupero (tra cui get) in genere non bloccare, così può sovrapposizione con le operazioni di aggiornamento (anche mettere e togliere). Retrievals riflettono i risultati delle operazioni di aggiornamento più recenti completate . Per operazioni di aggregazione come putAll e chiare, i recuperi simultanei possono riflettere l'inserimento o la rimozione di solo alcune voci.

segmenti sono per le operazioni di aggiornamento:

La concorrenza consentito fra le operazioni di aggiornamento è guidato dal costruttore argomento concurrencyLevel opzionale (default 16), che è utilizzato come un suggerimento per il dimensionamento interno.

Quindi, in breve, le letture non sono bloccate (è implementato come lettura di variabili volatili). Le scritture potrebbero bloccarsi a vicenda se scrivono nello stesso segmento.

+2

in breve, se un segmento viene aggiornato e qualche altro thread vuole leggerlo, sarà in grado di leggere, ma otterrà l'ultimo valore aggiornato (non il valore corrente/in corso), giusto? –

+0

@Naroji Sì, prima dell'aggiornamento o dopo l'aggiornamento, dipende da una possibilità di sovrapposizione delle operazioni di aggiornamento e lettura. Ma non qualcosa di misto/danneggiato. – kan

+0

grazie. "Retrievals riflette i risultati delle operazioni di aggiornamento completate più recentemente tenendo conto della loro insorgenza" significa> i recuperi riflettono i risultati che vengono aggiornati prima dell'arrivo di questi retrieval (chiedendo come non capisco il significato della frase e più specificatamente dell'inizio) –

0

Secondo documenti ConcurrentHashMap Oracle,

Il costruttore di ConcurrentHashMap assomiglia a questo:

ConcurrentHashMap pubblico (int initialCapacity, galleggiare loadFactor, int concurrencyLevel)

Così la linea di cui sopra crea una nuova mappa vuota con la capacità iniziale specificata, il fattore di carico e il livello di concorrenza. dove, Parametri importanti da prendere in considerazione da ConcurrentHashMap Costruttore:

  • initialCapacity - la capacità iniziale. L'implementazione esegue il dimensionamento interno per contenere questo numero di elementi.
  • concurrencyLevel - il numero stimato di thread di aggiornamento simultaneo. L'implementazione esegue il dimensionamento interno per provare ad adattare questo numero di thread .

Nell'Api di ConcurrentHashMap, troverete le seguenti costanti.

  • statico finale int DEFAULT_INITIAL_CAPACITY = 16;
  • statico finale int DEFAULT_CONCURRENCY_LEVEL = 16;

I parametri del parametro di capacità iniziale e del livello di concorrenza del costruttore ConcurrentHashMap (o Object) sono impostati su 16 per impostazione predefinita.

Quindi, anziché un blocco di mappa, ConcurrentHashMap mantiene un elenco di 16 blocchi di default (numero di blocchi uguale alla capacità iniziale, che per impostazione predefinita è 16) ciascuno dei quali viene utilizzato per bloccare un singolo bucket di la Map.This indica che 16 thread (numero di thread uguale al livello di concorrenza, che per default è 16) possono modificare la collezione allo stesso tempo, dato, ogni thread funziona su bucket differenti. Quindi, a differenza di hashtable, eseguiamo qualsiasi tipo di operazione (aggiornamento, eliminazione, lettura, creazione) senza bloccare l'intera mappa in ConcurrentHashMap.

Le operazioni di recupero (incluso get) in genere non bloccano. In questo caso utilizza il concetto di volatile., quindi potrebbe sovrapporsi alle operazioni di aggiornamento (incluse le operazioni di inserimento e rimozione). Recuperati riflettono i risultati delle operazioni di aggiornamento completate più recentemente che mantengono il loro esordio.

La concomitanza consentita tra le operazioni di aggiornamento è guidata dall'argomento facoltativo concurrencyLevel del costruttore (predefinito 16), che viene utilizzato come suggerimento per il dimensionamento interno. La tabella è partizionata internamente per cercare di consentire il numero indicato di aggiornamenti simultanei senza contesa. Poiché il posizionamento nelle tabelle hash è essenzialmente casuale, la concorrenza effettiva varierà. Idealmente, dovresti scegliere un valore per accogliere tutti i thread che modificheranno contemporaneamente la tabella. L'utilizzo di un valore significativamente superiore a quello necessario può sprecare spazio e tempo e un valore significativamente inferiore può portare a conflitti di thread.

Spero che aiuti!

Problemi correlati