多线程安全问题

多线程安全问题

模拟卖票案例
创建3个线程,同时开启,对共享的票进行出售

package com.Thread.ThreadSafe;
/*
   模拟卖票案例
   创建3个线程,同时开启,对共享的票进行出售
 */
public class Demo01Ticket {
    public static void main(String[] args) {
        //创建Runnable接口的实现类对象
        RunnableImpl 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();
    }
}

Runnable接口的实现类

package com.Thread.ThreadSafe;
/*
     实现卖票案例
 */
public class RunnableImpl implements Runnable {
    //定义一个多个线程共享的资源
    private  int ticket = 100;

    //设置线程任务:卖票
    @Override
    public void run() {
        //使用死循环,让卖票操作重复进行
        while (true){
            //提高安全问题出现的概率,让程序睡眠
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //先判断票是否存在
            if (ticket>0){
                //票存在,卖票 ticket--
                System.out.println(Thread.currentThread().getName()+"-->正在卖第"+ticket+"张票");
                ticket--;
            }
        }
    }
}

多线程安全问题原理图

你可能感兴趣的:(多线程安全问题)