根据上篇文章买票问题举例,还可能出现的问题:

 
代码如下:
class Window1 implements Runnable{
    private static int ticket = 100;
    @Override
    public void run() {
        while (true){
            if (ticket > 0){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + ":卖票,票号为:" + ticket);
                ticket--;
            }else {
                break;
            }
        }
    }
}
public class WindowTest1{
    public static void main(String[] args) {
        Window1 w = new Window1();
        Thread t1 = new Thread(w);
        Thread t2 = new Thread(w);
        Thread t3 = new Thread(w);
        t1.setName("窗口1");
        t2.setName("窗口2");
        t3.setName("窗口3");
        t1.start();
        t2.start();
        t3.start();
    }
}
 
运行结果如下:

我们可以看到出现了“0”票。
因为在此阻塞了,可能出现上文的极端状态
假如

这样重票的概率就大了
所以不管在哪里阻塞都会出现重票,错票
=========================================================================
引入问题:买票过程中,出现了重票,错票 --> 出现了线程的安全问题 问题出现的原因:当某个线程操作车票的过程中,尚未操作完成时,其他线程参与进来,也操作车票 如何解决? 根据生活中的事情举例: 假如你在上厕所,另一个人很急,冲进了你所在的厕所。这就出现了安全问题。应该如何解决? 答:把厕所门锁住 当一个线程a在操作ticket的时候,其他线程不能参与进来,直到线程a操作完成ticket时, 其他线程才可以开始操作ticket。这种情况即使线程a出现了阻塞,也不能被改变。
感谢观看!!!













![SpringCloud系列(九)[docker 篇] - Centos 7 下 Docker 的安装及基本操作指令](https://img-blog.csdnimg.cn/031c702096e04720bc4be3d504edda72.png)




