关于java线程票数超卖问题

img

img

img


最后输出不应该还有“老 shi得票-1”和“黄牛党得票-2”吗,小明这条线程终止了,其他两条应该没终止吧

你三个线程共用的一个Runable,属于资源共享了 一个结束都结束了
你可以试试创建三个Test1分别开启线程
你这个ticket没加锁,三个线程肯定会乱卖的

题主,你写的这个代码有两个问题。

  1. 多个线程之间共享一个数据的时候,需要给数据加锁,写锁代码块。
  2. 再售票之前去判断一下是否有余票,而不是售票完成之后再判断。否则会出现余票为0,依然售票一张
    正确代码如下:

public class SellTicket implements Runnable {
    public Integer ticket = 100;
    @Override
    public void run() {
        while (true){
            /**
             * 加锁
             */
            synchronized (ticket){
                if (ticket <= 0){
                    break;
                }
                System.out.println(Thread.currentThread().getName()+"得票1张,剩余:\t\t"+--ticket);
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
    public static void main(String[] args) {
        SellTicket sellTicket = new SellTicket();
        Thread t1 = new Thread(sellTicket,"小明");
        Thread t2 = new Thread(sellTicket,"老师");
        Thread t3 = new Thread(sellTicket,"黄牛党");
        t2.start();
        t1.start();
        t3.start();
    }
}

你多运行几次就可以了,而且会出现多种不一样的结果。如果你想出现-1 ,-2 。那么就需要线程同步处理了

```java
synchronized (this){
System.out.println(Thread.currentThread().getName() + "得票:" + --ticket);
}

小明-余票:9
黄牛-余票:8
老师-余票:7
黄牛-余票:6
老师-余票:5
小明-余票:4
黄牛-余票:3
小明-余票:2
老师-余票:1
小明-余票:0
老师-余票:-1
黄牛-余票:-2

Process finished with exit code 0

```。