6
votes

Que se passe-t-il lorsque nous passons hashable à l'intérieur des collections.synchronizedMap ()

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.


0 commentaires

5 Réponses :


1
votes

Il sera enveloppé dans un synchronizedMap , à partir de java.util.collections : xxx

the synchronisemap () La méthode ne distingue pas entre les types de cartographie s passés à elle.


0 commentaires

2
votes

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: xxx

la synchronisation supplémentaire n'est pas nécessaire et peut conduire à des performances plus basses.

Un autre effet est que vous ne pourrez pas utiliser API à partir de HASHTABLE comme HASHTABLE # éléments car la collection enveloppée est Maintenant, strictement une carte instance.


0 commentaires

3
votes

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 Taille () sur la carte résultante. La mise en œuvre dans la classe collections.synchronizedMap ressemble à ceci: xxx

... où, m.Size () appelle la mise en œuvre dans hashtable : xxx

Le premier objet de verrouillage est le champ mutex dans synchronisémap < / code>. Le deuxième verrouillage est implicite - l'instance hashtable elle-même.


0 commentaires

0
votes

"Sa question est que nous pouvons transmettre n'importe quel type de carte dans cette méthode."

La réponse est oui, car le constructeur de synchronizedmap accepte chaque carte dans sa signature.

"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"

La réponse est la suivante: nous montrons l'ignorance au Concourshashmap qui est probablement l'outil à utiliser au lieu d'une implémentation de blocage.


0 commentaires

0
votes

Si vous voyez le code dans le synchronisécollection . 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 xxx

La mise en oeuvre de la taille ressemble à ceci dans HASHTABLE Classe xxx

donc, si vous passez dans hashtable à synchronisécollection , le fil accédant à synchronisécollection 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 même lorsque le thread a eu le verrouillage sur synchronisécollection >


2 commentaires

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.