Aujourd'hui, j'ai posé une question dans mon entretien. La question est que Collections.SynchronizedMap () est Utilisé pour synchroniser la carte qui sont par défaut, pas de fil de sécurité comme HASHMAP. Sa question est que nous pouvons transmettre n'importe quel type de carte dans cette méthode. Alors, quel est l'effet lorsque nous passons une haquetable à l'intérieur de cette méthode car la hache est synchronisée par défaut. P>
5 Réponses :
Il sera enveloppé dans un the synchronizedMap code>, à partir de
java.util.collections code>:
synchronisemap () Code> La méthode ne distingue pas entre les types de
cartographie code> s passés à elle. p> p>
Vous auriez deux niveaux de synchronisation: un au niveau de la carte synchronisée elle-même, mise en œuvre par un objet mutex, et un au niveau de l'instance emballée: la synchronisation supplémentaire n'est pas nécessaire et peut conduire à des performances plus basses. p> Un autre effet est que vous ne pourrez pas utiliser API à partir de HASHTABLE code> comme
HASHTABLE # éléments code>
car la collection enveloppée est Maintenant, strictement une carte code> instance. p> p>
Le comportement de la carte sera identique, mais les performances seront affectées, car chaque méthode va acquérir deux verrous de synchronisation au lieu d'un.
Par exemple, envisagez d'appeler la méthode ... où, Le premier objet de verrouillage est le champ Taille () code> sur la carte résultante. La mise en œuvre dans la classe
collections.synchronizedMap code> ressemble à ceci: p>
m.Size () code > appelle la mise en œuvre dans
hashtable code>: p>
mutex code> dans
synchronisémap < / code>. Le deuxième verrouillage est implicite - l'instance
hashtable code> elle-même. P> p>
"Sa question est que nous pouvons transmettre n'importe quel type de carte dans cette méthode." P>
La réponse est oui, car le constructeur de "Alors, quel est l'effet lorsque nous transmettons une haquetable à l'intérieur de cette méthode, car la hache est synchronisée par défaut" p>
La réponse est la suivante: nous montrons l'ignorance au synchronizedmap code> accepte chaque carte code> dans sa signature. p>
Concourshashmap code> qui est probablement l'outil à utiliser au lieu d'une implémentation de blocage. P>
Si vous voyez le code dans le La mise en oeuvre de la taille ressemble à ceci dans donc, si vous passez dans synchronisécollection code>. Les méthodes délégueront l'appel à la collection sous-jacente, mais ajoutant un bloc synchronisé sur l'appel de l'appel comme celui-ci
HASHTABLE code> Classe p>
hashtable code> à
synchronisécollection code>, le fil accédant à
synchronisécollection Le code> devra prendre les verrous à 2 niveaux une fois pour le bloc synchronisé et un autre pour la méthode synchronisée.
S'il y a d'autres threads à l'aide de l'objet Hashtable directement, ils peuvent bloquer les threads à l'aide du
synchronisécollection code> même lorsque le thread a eu le verrouillage sur
synchronisécollection p> p> p> p> p> P> >
Copie de la réponse de Natix?
J'ai écrit la réponse en parallèle à lui, je pense que je ne suis pas sûr de savoir pourquoi il est commandé ci-dessous, plus j'ai donné une raison pour laquelle ne pas le faire.