码迷,mamicode.com
首页 > 编程语言 > 详细

多线程售票

时间:2021-05-25 18:22:25      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:extend   end   允许   java   thread   oid   getname   cat   ide   

先看下面的程序来售票

 1 package thread;
 2 
 3 public class Ticket {
 4     public static void main(String[] args) {
 5         SaleWindow saleWindow1 = new SaleWindow();
 6         SaleWindow saleWindow2 = new SaleWindow();
 7         SaleWindow saleWindow3 = new SaleWindow();
 8 
 9         saleWindow1.start();
10         saleWindow2.start();
11         saleWindow3.start();
12     }
13 }
14 
15 class SaleWindow extends Thread {
16     private static int ticket_num = 100;
17     @Override
18     public void run() {
19        while (true) {
20            if (ticket_num <= 0) {
21                System.out.println("售票结束");
22                break;
23            }
24            // 休眠50毫秒。模拟卖票要时间
25            try {
26                Thread.sleep(50);
27            } catch (InterruptedException e) {
28                e.printStackTrace();
29            }
30            System.out.println("当前窗口为 " + Thread.currentThread().getName() + "还剩 " + (--ticket_num) + "张票");
31 
32        }
33     }
34 }

输出结果分析:

技术图片

 

 出现上面情况的原因分析:、

线程123都会判断<=0不是成立的

所以123线程同时进到下面代码

技术图片

 

 

技术图片

 

 解决方案:

1)用synchronized关键字:synchronized是Java中的一个关键字,是一个内部锁。它可以使用在方法上和方法块上,表示同步方法和同步代码块。在多线程环境下,同步方法或者同步代码块在同一时刻只允许有一个线程在执行,其余线程都在等待获取锁,也就是实现了整体并发中的局部串行。

技术图片

 

多线程售票

标签:extend   end   允许   java   thread   oid   getname   cat   ide   

原文地址:https://www.cnblogs.com/YXBLOGXYY/p/14808231.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!