线程知识巩固第二节

多线程之经典案例–售票案例

 public static void main(String[] args) {
 
        System.out.println("Hello World!");
        new MyThread("张三 ").start();
        new MyThread("李四 ").start();
      
    }

    public static class MyThread extends Thread {

        // 需要卖的票数
        int mTicket = 12;

        public MyThread(String name) {
            super(name);
        }

        @Override
        public void run() {
            while (mTicket > 0) {
                if (mTicket > 0) {
                    System.out.println(getName() + "卖出了第" + mTicket + "张票");
                    mTicket--;
                } else {
                    System.out.println("票卖完了");
                }

            }
        }
    }

在这里插入图片描述

这时你就会发现因为车票没有共享,所以造成了每一个人都卖出去了12张车票,为了不引起这种换买票的行为,所以我们需要把车票共享,因此需要把车票定义为静态常量,用static修饰。这时有会出现另一种问题,可能同一时间张三和李四卖出了同一张票,为了不引起这种换买票的行为,所以我们需要把车票上锁(Synchronzied:同步锁,作用是实现线程间同步,对同步的代码加锁,使得每一次,只能有一线程进入同步块,从而保证线程间的安全性),比如张三正在卖这张票,李四就看不见了。张三不卖了,李四才能对这张车票进行处理。

 public static void main(String[] args) {

        System.out.println("Hello World!");

        new MyThread("张三 ").start();
        new MyThread("李四 ").start();
    }

    public static class MyThread extends Thread {

        // 需要卖的票数
        static int mTicket = 12;

        // 创建一个静态钥匙
        static Object key = new Object();

        public MyThread(String name) {
            super(name);
        }

        @Override
        public void run() {
            while (mTicket > 0) {
                synchronized (key) {
                    if (mTicket > 0) {
                        System.out.println(getName() + "卖出了第" + mTicket + "张票");
                        mTicket--;
                    }
                }
            }
            if (mTicket == 0) {
                System.out.println("票卖完了");
            }
            try {
                //休息一秒
                sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值