其他分享
首页 > 其他分享> > 线程安全问题的概述和线程安全的代码实现与问题产生的原理

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

作者:互联网

线程安全

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