La principale recherche de cet article est le contenu pertinent de l'utilisation de ConcurrentMap.putIfAbsent(key,value) , comme suit.
Ce type de scénario est souvent rencontré dans les affaires. Unmap simultané simultané est maintenu à l'échelle mondiale. Chaque clé de la carte correspond à un objet, et cet objet ne doit être créé qu'une seule fois. Si la valeur correspondant à la clé de la carte n'existe pas, elle sera créée, sinon elle sera renvoyée directement.
Regardons d'abord le code:
Les paramètres publics statiques publics GetInstance (Langue String, String Country, String Variant) {// ... String Key = Some_String; Locale locale = map.get (key); if (Locale == NULL) {Locale = Nouveau lieu (langue, pays, variante); map.put (clé, paramètres régionaux); } retour des paramètres régionaux; } Ce que ce code doit faire est:
Nous nous attendons à ce que chaque fois que la méthode GetInstance est appelée, nous devons nous assurer que la même clé renvoie la même référence d'objet local. Ce code peut-il réaliser cette exigence?
La réponse est: les exigences peuvent être satisfaites dans un environnement unique, mais il y aura des problèmes de sécurité des fils dans un environnement multi-thread, c'est-à-dire qu'il ne peut être garanti que la même clé de concurrence renverra la même référence d'objet local.
En effet, il y a une habitude dans le code ci-dessus appelé opération put-absente [1], et cette opération a une condition de course:
if (Locale == NULL) {Locale = Nouveau lieu (langue, pays, variante); map.put (clé, paramètres régionaux); } Parce qu'après qu'un thread a fini de juger les paramètres locaux == null, il est vrai de mettre de la valeur sur la carte. D'autres threads ont peut-être déjà fait des opérations sur la carte. Lorsque vous effectuez à nouveau des opérations, l'objet local correspondant à la même clé est écrasé, et enfin la référence locale de la même clé renvoyée par la méthode GetInstance sera incohérente. Par conséquent, le fonctionnement de la carte sur la carte n'est pas sûr (filetage sûr).
Pour résoudre ce problème, Java 5.0 a introduit l'interface concurrentMAP, où l'opération IF-ABSET existe sous la forme d'une méthode atomique putIfAbsent(K key, V value) . Comme l'écrit Javadoc:
Lors de l'ajout d'une paire de valeurs de clé au concurrenthashmap, il déterminera d'abord si la paire de valeurs clés existe déjà.
Réviser la méthode ci-dessus:
Les paramètres publics statiques publics GetInstance (Langue String, String Country, String Variant) {// ... String Key = Some_String; Locale locale = map.get (key); if (Locale == NULL) {Locale = Nouveau lieu (langue, pays, variante); Map.PUTIFABSENT (clé, paramètres régionaux); } retour des paramètres régionaux; } Ce code utilise la forme simultanée de MAP (concurrentMap, ConcurrentHashMap) et utilise simplement l'instruction map.putIfAbsent(key, locale) . Cela ne garantit pas non plus que la même clé renvoie la même référence d'objet local.
L'erreur ici est que la méthode Putifabsente a une valeur de retour et que la valeur de retour est importante.
Par conséquent, lors de l'utilisation de la méthode Putifabsente, n'oubliez pas de juger la valeur de retour.
Les paramètres publics statiques publics GetInstance (Langue String, String Country, String Variant) {// ... String Key = Some_String; Locale locale = map.get (key); if (Locale == NULL) {Locale = Nouveau lieu (langue, pays, variante); Locale tmp = map.putifabsent (clé, paramètres régionaux); if (tmp! = null) {Locale = tmp; }} retour des paramètres régionaux; } Importer java.util.map; importer java.util.concurrent.concurrenthashmap; public class test {public static void main (string [] args) {// test currenthashmap.putifabsent () map <long, string> clientmap = new concurrentHashmap <> (); system.out.println ("imprimer climys First "); System.out.println (" ClientMap: "+ ClientMap); System.out.println (); // Ajouter un nouvel enregistrement dans le ClientMap vide System.out.println (" Ajouter un nouvel enregistrement dans le ClientMap vide "); System.out.println (" Ajouter un ClientMap précédent: "+ ClientMap); Long NetId = 1234567L; ClientMap.PUTIFABSENT (NETID, STR1); System.out.println ("Ajouter un ClientMap précédent:" + ClientMap); System.out.println ("Afficher la valeur de retour Résultat:" + Result); System.out.println (); // Répéter Add System.out.println ("Répondre le dernier enregistrement"); System.out.Tprint result2 = clientMap.PUTIFABSENT (netid, str1); System.out.println ("après avoir ajouté ClientMap:" + ClientMap); System.out.println ("View Return Value Result:" + Result2); System.out.println ();}}Ce qui précède est l'intégralité du contenu de cet article sur l'exemple d'utilisation de ConcurrentMap.PUTIFABSENT (clé, valeur) et j'espère que cela sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!