编程语言

线程安全问题引入(2020-03-31)

2020-03-31  本文已影响0人  _NewMoon

售票问题

考虑这样一个问题,现在有一家电影院正在售票,假设票的编号为1~100(每种编号的电影票只有一张):

我们用代码来演示一下这种情况:
构造一个Ticket类,实现了Runnable接口,用来表示电影票,构建了三个线程,代表三个售票窗口:

Ticket.java

package Thread.Problem;


public class Ticket implements Runnable
{
    //总票数
    private int tik = 100;
    @Override
    public void run() {
        while(true) {
            if(tik>0){
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"is sailing No." + tik);
                tik--;
            }
        }
    }
}

Mythread.java

package Thread.Problem;

public class Mythread {
    public static void main(String[] args) {
        Ticket t = new Ticket();

        //开启三个卖票窗口
        Thread t0 = new Thread(t);
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);

        //开始售票
        t0.start();
        t1.start();
        t2.start();
    }
}

程序运行结果

Output

通过观察输出,我们发现了情况3中提到的两种问题,出现这种情况的原因就是,三个线程共享了Ticket中的tik数据,所以三个线程争夺CPU的执行权导致了多种情况的发生,如何解决这个问题,记录在下一篇中。

上一篇 下一篇

猜你喜欢

热点阅读