Java实现抢红包功能

  

本文实例为大家分享了Java实现抢红包功能的具体代码,供大家参考,具体内容如下

  

<>强关键思想:

  

1。抢红包涉及多人并发操作,需要做好同步保证多线程运行结果正确。

  

2。由于同时在线人数大,从性能方面考虑,玩家的发红包请求不必及时响应,而由服务端定时执行发红包队列。

  

<强>下面是主要的代码和实现逻辑说明

  

1。创建一个类,表示红包这个实体概念。直接采用原子变量保证增减同步. java的原子变量是一种精度更细的同步机制,在高度竞争的情况下,锁的性能将超过原子变量的性能,但在更真实的竞争情况,原子变量享有更好的性能。
  

        公开课SpringGift {   私人字符串的作用;   私人AtomicInteger礼物;   公共字符串getRole () {   返回角色;   }   公共空间setRole (String角色){   这一点。角色=角色;   }   公共AtomicInteger getGift () {   返回的礼物;   }   公共空间setGift (AtomicInteger礼物){   这一点。礼物=礼物;   }      公共int getRemainCount () {   返回this.gift.get ();   }   }      

2。采用多线程模拟多人同时抢红包。服务端将玩家发出的红包保存在一个队列里,然后用定工作时将红包信息推送给玩家。每一批玩家的抢红包请求,其实操作的都是从队列中弹出的第一个红包元素,但当前的红包数量为空的时候,自动弹出下一个红包(如果有的话)。
  

        公共类测试{   公共静态ConcurrentLinkedQueue队列;   公共静态SpringGift currGift;   公共静态AtomicInteger数=new AtomicInteger ();   静态类myThread实现Runnable {   公共空间run () {   handleEvent ();   }   }   公共静态void main (String [] args){抛出异常   队列=new ConcurrentLinkedQueue ();   (int i=0; i<3,我+ +){   SpringGift礼物=new SpringGift ();   gift.setRole(“角色”+ i);   礼物。setGift(新AtomicInteger (50));   queue.add(礼物);   }   myThread myThread=new myThread ();   for (int i=0; i<1000;我+ +){   新线程(mythread) .start ();   }      System.err.println(“总共收到" + count.get ());   }   私有静态SpringGift getGift () {//防止多条线程同时弹出队首   同步(队列){//若没有加锁,打印的数总数不对! ! ! !   如果(currGift==null | | currGift.getRemainCount () & lt;=0) {   currGift=queue.poll ();   }   }   返回currGift;   }   公共静态孔隙handleEvent () {   尝试{   SpringGift obj=getGift ();      如果(obj==null | | obj.getRemainCount () & lt;=0) {   System.err.println(“没有了”);   返回;   }   如果(obj !=零,,.getAndDecrement obj.getGift()()在0){   System.err.println(“抢到一个红包”);   count.getAndIncrement ();   }   thread . sleep(500);//模拟处理其他操作   }捕捉(异常e) {   e.printStackTrace ();   }   }   }      

运行结果部分截图如下

  

癑ava实现抢红包功能“
  

  

需要注意的是,getGift()这个方法,由于是自动弹出队首元素,必须做好同步机制,否则,当多个请求同时操作某一个红包的最后一次剩余时,会造成总的红包数量不正确。

  

(将加锁的代码注释后,会发现打印的总数量有可能不正确了!)

  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

Java实现抢红包功能