在java中,Hashmap是线程不安全的,通过锁的机制和粒度,在源码中提供了HashTable和ConcurrentHashMap两种数据结构供使用,但是如果不使用锁,有什么方法将HashMap做到再业务中是线程安全的呢?
==========================================================================
我有一种思路是这样的:首先有一个map,再使用它的时候,将他赋值给一个新的map,我们叫他map',然后再将该map'做为key,存成一个新map。新map为Map<map',value>,这样每次添加的时候,是基于map'来添加的?
各路大神,还有没有其他思路呢?大家一起来讨论讨论哈。
La méthode mentionnée par l'affiche est
.CopyOnWrite
. L'idée principale est de créer une copie pendant le fonctionnement, mais vous pouvez vous référer àJDK
deCopyOnWriteArrayList
. En fait, elle est également verrouillée pendantset
. opération.Lors du parcours Lors de l'utilisation d'une copie, il n'est pas nécessaire de verrouiller l'opération Parce que si elle n'est pas verrouillée, ce sera un casse-tête de fusionner les données finales (ce qui signifie que vous devez verrouiller lorsquemerge
)Les données partagées ne peuvent pas être thread-safe sans verrous. L’étape de copie de votre méthode n’est pas sécurisée pour les threads.
Pour garantir la sécurité des threads, ne partagez pas ou n'utilisez pas de verrous
Chaque fois que vous effectuez une copie, comment pouvez-vous vous assurer que tous les threads sont visibles après chaque traitement ? Et si vous l'ajoutez en fonction de map', cela peut entraîner des problèmes de transaction de base de données, tels qu'une non-relecture, un ajout de thread après en mettant à jour la carte, le thread B est écrasé par une nouvelle carte' ; si la visibilité du thread n'a pas besoin d'être garantie, utilisez ThreadLocal pour la localisation des variables.
Collections.synchronizedMap(Map)
peut être encapsulé comme thread-safe
La sécurité des fils ne peut être obtenue sans utiliser des verrous. Cela dépend simplement du niveau d'avancement de votre serrure.
HashTable Parce que toutes les opérations de verrouillage d'objets seront synchronisées, il s'agit de l'application la plus basique.
Le verrou de ConcurrentHashMap est relativement avancé, car il implémente une fonction de type partition en interne et stocke différentes clés dans différentes zones. Cette implémentation permet à plusieurs threads d'opérer ConcurrentHashMap en même temps, mais les opérations sur la même zone ne peuvent toujours être effectuées que. Opération à filetage unique (verrouillage).
Collections.synchronizedMap......?