この記事では、Javaの特定のコードを共有して、参照用のRed Envelope Grab関数を実装しています。特定のコンテンツは次のとおりです
重要なアイデア:
1.グラブリングレッドエンベロープには、複数の人々の同時操作が含まれ、マルチスレッド操作の結果が正しいことを確認するために同期が必要です。
2。パフォーマンスの観点から、オンラインで多くの人々がオンラインで多くの人がいるため、プレイヤーは赤いエンベロープのリクエストを送信するためにタイムリーに応答する必要はありませんが、サーバーはRed Envelopeのキューを定期的に実行します。
以下はメインコードと実装ロジックの説明です
1.赤い封筒のエンティティの概念を表すクラスを作成します。原子変数を直接使用して、増加と減少の同期を確保します。 Javaの原子変数は、より微細な同期メカニズムです。非常に競争の激しい状況では、ロックのパフォーマンスは原子変数のパフォーマンスを超えますが、より現実的な競争の状況では、原子変数はより良いパフォーマンスを享受します。
パブリッククラスSpringGift {プライベート文字列ロール; Private Atomicintegerギフト; public string getrole(){return role; } public void setrole(string role){this.role = role; } public Atomicinteger getGift(){return Gift; } public void setGift(Atomicinteger Gift){this.gift = gift; } public int getRemainCount(){return this.gift.get(); }} 2。マルチスレッドシミュレーションを使用して、同時に赤い封筒をつかみます。サーバーは、プレーヤーがキューに送信した赤い封筒を保存し、ジョブを使用して、レッドエンベロープ情報を定期的にプレーヤーにプッシュします。プレイヤーの各バッチのRed Envelope Grabリクエストは、実際にキューからポップアップされた最初のRed Envelope Elementによって操作されますが、現在の赤い封筒の数が空になると、次の赤い封筒が自動的にポップアップします(存在する場合)。
パブリッククラステスト{public static concurrentlinkedqueue <springgift> queue;パブリックスタティックスプリングギフトカリフト。 public Static AtomicInteger count = new AtomicInteger();静的クラスMythReadはrunnable {public void run(){handleEvent(); }} public static void main(string [] args)スロー例外{queue = new concurrentlinkedqueue <springgift>(); for(int i = 0; i <3; i ++){springgift gift = new SpringGift(); gift.setrole( "role"+i); gift.setgift(new AtomicInteger(50)); queue.add(ギフト); } mythread mythread = new mythread(); for(int i = 0; i <1000; i ++){new Thread(mythread).start(); } system.err.println( "合計で受信"+count.get()); } private static springgift getGift(){//複数のスレッドが同時にキューに出ないようにするのを防ぎます(queue){//ロックがない場合、印刷カウントの総数は正しくありません! ! ! ! if(currgift == null || currgift.getRemainCount()<= 0){currgift = queue.poll(); }} return currgift; } public static void handerevent(){try {springgift obj = getGift(); if(obj == null || obj.getRemainCount()<= 0){system.err.println( "not");戻る ; } if(obj!= null && obj.getGift()。getandDecrement()> 0){system.err.println( "get a red envelope"); count.getandincrement(); } thread.sleep(500); //他の操作をシミュレートして処理} catch(例外e){e.printstacktrace(); }}}実行結果のスクリーンショットは次のとおりです
getGift()メソッドがヘッダー要素を自動的にポップアップするため、同期メカニズムを実行する必要があることに注意してください。それ以外の場合、複数のリクエストが特定の赤い封筒の最後の残りを同時に動作させると、赤い封筒の総数が正しくありません。
(ロックされたコードについてコメントした後、印刷された総数が間違っている可能性があることがわかります!)
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。