ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java学习——线程安全概念(卖票案例模拟)

2020-06-15 20:02:20  阅读:212  来源: 互联网

标签:Runnable Java Thread 卖票 线程 run ticket


线程安全

如果有多个线程在同时运行,而这些线程可能会同时运行这段代码,程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。即——当多个线程访问某一个类(对象)时,这个类始终都能表现出正确的行为。

卖票案例模拟线程安全问题
【案例描述】电影院要卖票,我们模拟电影院的卖票过程。假设要播放的电影是 “战狼3”,本次电影的座位共100个 (本场电影只能卖100张票)。 我们来模拟电影院的售票窗口,实现多个窗口同时卖 “葫芦娃大战奥特曼”这场电影票(多个窗口一起卖这100张票) 需要窗口,采用线程对象来模拟;需要票,Runnable接口子类来模拟。

程序演示

public class RunnableImpl implements Runnable{

    //定义一个多线程共享的票源
    private int ticket = 100;

    //设置线程任务:卖票
    @Override
    public void run() {
        while (true) {
            //先判断票是否存在
            if(ticket > 0) {
                //票存在,卖票 ticket--
                //提高安全问题出现的概率,让程序睡眠
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+ "-->正在,卖第"+ ticket + "张票");
                ticket--;
            }
        }
    }
}
/*
    模拟卖票案例
    创建3个线程,同时开启,对共享的票进行出售
*/
public class Demo01Ticket {

    public static void main(String[] args) {
        //创建Runnable接口的实现类对象
        Runnable run = new RunnableImpl();//多态
        //创建Thread类对象,构造方法中传递Runnable接口的实现类对象
        Thread t0 = new Thread(run);
        Thread t1 = new Thread(run);
        Thread t2 = new Thread(run);

        //调用start方法开启多线程
        t0.start();
        t1.start();
        t2.start();
    }
}

在这里插入图片描述
我们可以发现程序出现了两个问题:

  1. 相同的票数,比如第7张票被卖了两回。
  2. 不存在的票,比如0票与-1票,是不存在的。

这种问题,几个窗口(线程)票数不同步了,称为线程不安全。


线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写 操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步, 否则的话就可能影响线程安全。

标签:Runnable,Java,Thread,卖票,线程,run,ticket
来源: https://blog.csdn.net/weixin_44664432/article/details/106728083

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有