316线程安全问题的概述和317代码的实现

线程安全问题

如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。

程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

我们通过一个案例,演示线程的安全问题电影院要卖票,我们模拟电影院的卖票过程。

假设要播放的电影是“葫芦娃大战奧特曼″,本次电影的座位共100个(本场电影只能卖100张票)。

我们来模拟电影院的售票窗口,实现多个窗口同时卖“葫芦娃大战奧特曼这场电影票(多个窗口一起卖这100张票)需要窗口,

采用线程对象来模拟;需要票, Runnable接口子类来模拟

 

 代码实现

package com.example.demo06code.demo01;

/* 
    实现卖票案例
*/
public class RunnableImpl implements Runnable{
    // 定义一个多线程贡献的票源
    private int ticket = 100;
    // 设置线程任务:卖票
    @Override
    public void run() {
        // 使用死循环 让卖票操作重复执行
        while (true){
            // 先判断票是否存在
            if (ticket > 0){
                // 使用线程睡眠提高安全问题出现的概率
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 卖票
                System.out.println("在卖"+Thread.currentThread().getName()+"线程的第:"+ticket+"张票");
                ticket--;
            }
        }
    }
}

/* 
    模拟卖票案例
    创建了3个共享线程,同时开启,对共享的票进行出售
*/
class Demo01Tic {
    public static void main(String[] args) {
        // 创建实现类对象
        RunnableImpl runnable = new RunnableImpl();
        // 创建Thread类对象,构造方法中传递Runnable接口的实现类
        Thread thread0 = new Thread(runnable);
        Thread thread1 = new Thread(runnable);
        Thread thread2 = new Thread(runnable);
        // 调用start开启多线程
        thread0.start();
        thread1.start();
        thread2.start();
    }
}

 

posted @ 2022-07-08 10:37  ja不会va  阅读(44)  评论(0)    收藏  举报