java - HashMap中在项目中不用锁,使用什么方法可以把他改造成线程安全的?
PHPz
PHPz 2017-04-18 09:48:14
0
6
523

在java中,Hashmap是线程不安全的,通过锁的机制和粒度,在源码中提供了HashTable和ConcurrentHashMap两种数据结构供使用,但是如果不使用锁,有什么方法将HashMap做到再业务中是线程安全的呢?

==========================================================================

我有一种思路是这样的:首先有一个map,再使用它的时候,将他赋值给一个新的map,我们叫他map',然后再将该map'做为key,存成一个新map。新map为Map<map',value>,这样每次添加的时候,是基于map'来添加的?

各路大神,还有没有其他思路呢?大家一起来讨论讨论哈。

PHPz
PHPz

学习是最好的投资!

répondre à tous(6)
Ty80

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 de CopyOnWriteArrayList. En fait, elle est également verrouillée pendant set. 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 lorsque merge)

.
刘奇

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......?

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!