java多线程下模拟抢票

Posted xiaoqiqistudy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程下模拟抢票相关的知识,希望对你有一定的参考价值。

我们设置三个对象分别同时抢20张票,利用多线程实现.

 1 public class Web123506 implements Runnable
 2   private int ticteksNums=20;//票数
 3 
 4     @Override
 5     public void run() 
 6      while (true)
 7          if(ticteksNums<0)
 8              break;
 9          
10         /* try 
11              //睡眠
12              Thread.sleep(200);
13           catch (InterruptedException e) 
14              e.printStackTrace();
15          */
16          System.out.println(Thread.currentThread().getName()+"-->抢到了"+ticteksNums--);
17 
18      
19     
20 
21     public static void main(String[] args) 
22            // 一份资源
23         Web123506 web = new Web123506();
24         //多个代理
25         new Thread(web,"我们").start();
26         new Thread(web,"你们").start();
27         new Thread(web,"黄牛党").start();
28 
29     
30 
31 

运行结果为:

我们-->抢到了20
黄牛党-->抢到了18
你们-->抢到了19
黄牛党-->抢到了16
我们-->抢到了17
黄牛党-->抢到了14
你们-->抢到了15
黄牛党-->抢到了12
我们-->抢到了13
黄牛党-->抢到了10
你们-->抢到了11
黄牛党-->抢到了8
我们-->抢到了9
黄牛党-->抢到了6
你们-->抢到了7
黄牛党-->抢到了4
我们-->抢到了5
黄牛党-->抢到了2
你们-->抢到了3
黄牛党-->抢到了0
我们-->抢到了1

结论:

我们可以看到抢到的票没有重复的,说明线程是安全的.

 

这时候我们加入线程的睡眠.观察线程此时是不是安全的?

 1 public class Web123506 implements Runnable
 2   private int ticteksNums=20;//票数
 3 
 4     @Override
 5     public void run() 
 6      while (true)
 7          if(ticteksNums<0)
 8              break;
 9          
10          try 
11              //睡眠
12              Thread.sleep(200);
13           catch (InterruptedException e) 
14              e.printStackTrace();
15          
16          System.out.println(Thread.currentThread().getName()+"-->抢到了"+ticteksNums--);
17 
18      
19     
20 
21     public static void main(String[] args) 
22            // 一份资源
23         Web123506 web = new Web123506();
24         //多个代理
25         new Thread(web,"我们").start();
26         new Thread(web,"你们").start();
27         new Thread(web,"黄牛党").start();
28 
29     
30 
31 

运行结果:

黄牛党-->抢到了20
我们-->抢到了19
你们-->抢到了18
黄牛党-->抢到了17
我们-->抢到了16
你们-->抢到了15
黄牛党-->抢到了14
我们-->抢到了13
你们-->抢到了12
你们-->抢到了11
我们-->抢到了10
黄牛党-->抢到了9
你们-->抢到了8
我们-->抢到了7
黄牛党-->抢到了6
你们-->抢到了5
我们-->抢到了4
黄牛党-->抢到了3
你们-->抢到了2
我们-->抢到了1
黄牛党-->抢到了0
你们-->抢到了-1
我们-->抢到了-1

结论:

当我们加入线程的睡眠,此时抢到的票可能出现了负数或者会出现两个人抢到了同一张票此时说明加入线程睡眠线程是不安全的.

 

以上是关于java多线程下模拟抢票的主要内容,如果未能解决你的问题,请参考以下文章

多线程抢票系统浅析

模拟多线程实现抢票

6.1Java多线程抢票龟兔赛跑

java 多线程-改正不安全线程

网络抢票synchronized同步票数(多线程,线程安全 )

Linux:详解多线程(线程安全互斥和死锁)