ConcurrentHashMap lire et écrire des serrures
Je suis en train d'essayer de trouver des réponses à ces, mais de ne pas pouvoir le trouver sur Google ou en Java docs.
Cas 1: dans ConcurrentHashMap
, supposons qu'un thread t1 est la lecture de segment n, et même un autre thread t2 voulez écrire sur le même segment n:
Question 1: ces deux opérations seront l'un après l'autre, elles s'exécutent simultanément?
Cas 2: dans ConcurrentHashMap
, supposons qu'un thread t1 est écrit sur le segment n, et même un autre thread t2 voulez lire de la même segment n,
Question 2: ces deux opérations seront l'un après l'autre, elles s'exécutent simultanément?
salut..mis en évidence les questions
Alors, que voulez-vous dire entre ConcurrentHashMap et ReadWriteLock ?
Alors, que voulez-vous dire entre ConcurrentHashMap et ReadWriteLock ?
OriginalL'auteur Java Geek | 2013-04-19
Vous devez vous connecter pour publier un commentaire.
Je pense que javadoc les réponses à vos questions:
Segments sont pour les opérations de mise à jour:
Donc, en résumé, les lectures ne sont pas bloqués (il est mis en œuvre que la lecture des variables volatiles). Écrit pourrait se bloquer les uns les autres s'ils écrivent dans le même segment.
Oui, soit avant la mise à jour ou après la mise à jour, dépend de la chance la façon de mettre à jour et les opérations de lecture sont la superposition. Mais pas quelque chose de mixte/endommagé.
merci. "Les récupérations de refléter les résultats de la dernière mise à jour des opérations de portefeuille au moment de leur apparition" signifie > récupérations de refléter les résultats qui sont mis à jour avant de ces extractions est arrivé (en demandant que je ne comprends pas le sens de la phrase, et plus précisément d'apparition)
Ce que je comprends, l'opération de lecture lit la suite de la plus récente mise à jour terminée. Il est mis en œuvre à l'aide de
volatile
variable et donc suit en.wikipedia.org/wiki/Happened-before sémantique.OriginalL'auteur kan
Selon ConcurrentHashMap Oracle docs,
Le constructeur de ConcurrentHashMap ressemble à ceci :
public ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel)
De sorte que la ligne ci-dessus crée une nouvelle carte vide, avec une capacité initiale, le facteur de charge et niveau de simultanéité.
où,
Les Paramètres importants à considérer à partir de ConcurrentHashMap Constructeur:
interne de dimensionnement pour tenir compte de ce que de nombreux éléments.
le nombre estimé d'simultanément la mise à jour de threads. L'
la mise en œuvre effectue interne de dimensionnement pour tenter de répondre à cette
nombre de threads.
Dans le ConcurrentHashMap Api , vous trouverez les constantes suivantes.
capacité initiale du paramètre et de la concurrence au niveau des paramètres de ConcurrentHashMap constructeur (ou l'Objet) sont fixés à 16 par défaut.
Ainsi, au lieu d'une carte à l'échelle de verrouillage, ConcurrentHashMap tient à jour une liste de 16 écluses par défaut ( nombre de verrous égale à la capacité initiale , qui est par défaut à 16) dont chacune est utilisée pour verrouiller sur un seul compartiment de la Carte.Cela indique que 16 threads (nombre de threads égal au niveau de simultanéité , qui est par défaut 16) peut modifier la collection en même temps , étant donné ,chaque thread travaille sur différents seau. Donc, contrairement à la table de hachage, nous effectuons tout type d'opération ( mise à jour ,supprimer ,lire ,créer) sans verrouillage sur toute la carte dans ConcurrentHashMap.
Opérations d'extraction (y compris les obtenir) ne sont généralement pas bloquer. Il utilise le concept de volatiles dans ce cas., ainsi peuvent se chevaucher avec les opérations de mise à jour (y compris les mettre et de l'enlever). Les récupérations de refléter les résultats de la dernière mise à jour des opérations de portefeuille au moment de leur apparition.
Le permis de simultanéité entre les opérations de mise à jour est guidée par l'option concurrencyLevel argument du constructeur (16 par défaut), qui est utilisé comme un indicateur interne de dimensionnement. La table est partitionné en interne pour essayer de permis, le nombre de mises à jour simultanées sans contention. Car le placement dans les tables de hachage est essentiellement aléatoire, la simultanéité réelle peut varier. Idéalement, vous devriez choisir une valeur pour accueillir autant de threads que ne sera jamais simultanément modifier la table. À l'aide d'une valeur beaucoup plus élevée que vous avez besoin peut gaspiller le temps et l'espace, et la réduction significative de la valeur peut conduire à fil de contention.
J'espère que cela aide!
OriginalL'auteur Aman Goel