多线程共享数据引发的问题

 

 * @Description模拟用户网络购票
 */
public class TicketThread implements Runnable{
    private int ticket=10;//记录车票总数
    private int num=0;//记录用户抢到了几张票
    //用户抢票
    public void run(){
        while (true){
            //没有余票,跳出循环
            if (ticket<=0){
                break;
            }
            //有余票,则抢票。第一步:修改车票数:总票数再抢完票后减一张,用户抢到票了,抢票数+1
            ticket--;
            num++;
            //模拟网络延迟
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //第二步:显示出票反馈给用户
            System.out.println(Thread.currentThread().getName()+"抢到了第"+num+"张票,剩余"+ticket+"张票");
        }
    }

    public static void main(String[] args) {
        Runnable runnable=new TicketThread();
        Thread t1=new Thread(runnable,"淘票票");
        Thread t2=new Thread(runnable,"快手张");
        Thread t3=new Thread(runnable,"黄牛党");
        System.out.println("*******各方开始抢票******");
        t1.start();
        t2.start();
        t3.start();
    }
}

 发现问题:

    不是从第1张票开始

    存在多人抢一张票的情况

    有些票号没有被抢到

多个线程操作同一个共享资源时,将引发数据不安全问题

原因:多线程共同操作数据时,引发的冲突(如延迟时,操作未全部完成等等)

这里就需要用到线程同步来解决这个问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值