Cet article partage le code spécifique pour Java pour implémenter la fonction de saisie de l'enveloppe rouge pour votre référence. Le contenu spécifique est le suivant
Idées clés:
1. La saisie des enveloppes rouges implique des opérations simultanées pour plusieurs personnes, et la synchronisation est nécessaire pour garantir que les résultats de l'opération multi-thread sont corrects.
2. En raison du grand nombre de personnes en ligne en même temps, du point de vue des performances, les joueurs n'ont pas besoin de répondre en temps opportun pour envoyer des demandes d'enveloppe rouge, mais le serveur exécutera régulièrement la file d'attente d'enveloppe rouge.
Ce qui suit est le code principal et la logique d'implémentation Description
1. Créez une classe pour représenter le concept d'entité des enveloppes rouges. Utilisez directement les variables atomiques pour assurer la synchronisation de l'augmentation et de la diminution. Les variables atomiques de Java sont un mécanisme de synchronisation à grain plus fin. Dans des situations hautement compétitives, les performances de la serrure dépasseront les performances des variables atomiques, mais dans des situations de concurrence plus réalistes, les variables atomiques bénéficient de meilleures performances.
classe publique Springgift {Rôle de chaîne privée; cadeau privé atomicInteger; public String getRole () {Retour Role; } public void setRole (String Role) {this.role = role; } public atomicInteger getGift () {return cadeau; } public void setgift (AtomicInteger Gift) {this.gift = cadeau; } public int getRemainCount () {return this.gift.get (); }} 2. Utilisez une simulation multi-lancement pour saisir des enveloppes rouges en même temps. Le serveur enregistre les enveloppes rouges envoyées par le lecteur dans une file d'attente, puis utilise un travail pour pousser régulièrement les informations de l'enveloppe rouge vers le lecteur. Les demandes de saisie de l'enveloppe rouge pour chaque lot de joueurs sont réellement exploitées par le premier élément d'enveloppe rouge apparaissant à partir de la file d'attente, mais lorsque le nombre actuel d'enveloppes rouges est vide, la prochaine enveloppe rouge apparaîtra automatiquement (le cas échéant).
Test de classe publique {Public Static concurrentLinkEdQueue <Springgift> file d'attente; Springgift statique publique Currgift; Count public atomicinteger statique = new atomicInteger (); static class mythread implémente runnable {public void run () {handleEvent (); }} public static void main (String [] args) lève une exception {queue = new concurrentLinkEdQueue <s printemps> (); pour (int i = 0; i <3; i ++) {printemps dons = new Springgift (); don.setRole ("rôle" + i); don.SetGift (New AtomicInteger (50)); queue.add (cadeau); } mythread mythread = new mythread (); for (int i = 0; i <1000; i ++) {new thread (mythread) .start (); } System.err.println ("reçu dans Total" + count.get ()); } private statique priviltgift getGift () {// Empêchez plusieurs threads de sortir la file d'attente en même temps synchronisé (file d'attente) {// s'il n'y a pas de verrouillage, le nombre total de comptes imprimés est incorrect! ! ! ! if (currgift == null || currgift.getRemainCount () <= 0) {currgift = queue.poll (); }} return CurrGift; } public static void handleEvent () {try {Springgift obj = getGift (); if (obj == null || obj.getRemainCount () <= 0) {System.err.println ("Not"); retour ; } if (obj! = null && obj.getgift (). getAndDecment ()> 0) {System.err.println ("Get a Red Enveloppe"); count.getAndIncrement (); } Thread.sleep (500); // simuler et traiter d'autres opérations} catch (exception e) {e.printStackTrace (); }}}La capture d'écran des résultats en cours d'exécution est la suivante
Il convient de noter que puisque la méthode GetGift () apparaît automatiquement dans l'élément d'en-tête, le mécanisme de synchronisation doit être effectué. Sinon, lorsque plusieurs demandes fonctionnent en même temps la dernière enveloppe rouge, le nombre total d'enveloppes rouges sera incorrecte.
(Après avoir commenté le code verrouillé, vous constaterez que le nombre total d'imprimés peut être incorrect!)
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.