线程不安全问题实例

package com.shujia.day19.sellTickets;

/*
    使用Runnable的方式实现

    为了模拟更加真实的售票情况,我们加入延迟
    问题:
        我们加入了延迟之后,发现
        a. 有重复售卖同一张票的情况(原因1)
        b. 还出现了一个不该出现的票数据,比如第0张票,第-1张票(原因2)
    原因:
        1. cpu小小的时间片,足以让程序执行很多次
        2. 线程的执行具有随机性,且是抢占式执行的

    现象:线程不安全的现象
        如何判断一个程序是否存在线程不安全的现象呢?
        三要素(同时满足):
            1、是否存在多线程环境?
            2、是否存在共享数据?
            3、是否存在多条语句操作着共享数据?
    如何解决线程不安全的现象?
        1、同步代码块
        2、lock锁


 */
class Window implements Runnable{
    private static int tickets = 100;

    @Override
    public void run() {
        while (true){
            if(tickets>0){ // 1
                try {
                    // w2, w3, w1
                    Thread.sleep(50);//sleep()方法是静态的
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+" 正在出售第 "+(tickets--)+" 张票......");
                //窗口3 正在出售第 97 张票......
                //窗口2 正在出售第 97 张票......
                //..
                //窗口2 正在出售第 1 张票......
                //窗口3 正在出售第 0 张票......
                //窗口1 正在出售第 -1 张票......
            }
        }
    }
}

public class SellTicketDemo1 {
    public static void main(String[] args) {
        Window window = new Window();

        Thread w1 = new Thread(window,"窗口1");
        Thread w2 = new Thread(window,"窗口2");
        Thread w3 = new Thread(window,"窗口3");

        w1.start();
        w2.start();
        w3.start();

    }
}
posted @ 2024-08-19 21:29  ていせい  阅读(5)  评论(0编辑  收藏  举报