ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线程安全问题的概述和线程安全的代码实现与问题产生的原理

2022-07-08 10:01:24  阅读:120  来源: 互联网

标签:Thread 卖票 安全 线程 new 概述 ticket public


线程安全

如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
我们通过一个案例,演示线程安全的问题:
image

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

public class RunnableImpl implements Runnable{
    //定义一个多个线程共享的资源
    private int ticket = 100;

    //设置线程任务卖票
    @Override
    public void run() {
        //使用死循环重复卖票动作
        while(true){
            //线判断票是否存在
            if (ticket>0){
                //票存在,卖票,ticket--
                System.out.println(Thread.currentThread().getName()+"--->正在卖第"+ticket+"张票");
                ticket--;
            }
        }
    }
}

public class DemoTicket {
    public static void main(String[] args) {
        RunnableImpl r1 = new RunnableImpl();

        new Thread(r1).start();
        new Thread(r1).start();
        new Thread(r1).start();
    }
}

运行结果:

image

问题产生的原理

image
注意:
线程安全问题是不能产生的,我们可以让一个线程在访问共享数据的时候,无论是否失去了cpu的执行权,让其他的线程只能等待,等待当前线程买完票,其他线程在进行卖票
包证:使用一个线程在卖票

标签:Thread,卖票,安全,线程,new,概述,ticket,public
来源: https://www.cnblogs.com/ailhy/p/16457197.html

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

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

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

ICode9版权所有