多个线程对一个对象操作


如果是这样

    @Override
    public void run() {
    
    
        while (true){
    
    
            if(ticketNums <= 0){
    
    
                break;
            }
            try {
    
    
                Thread.sleep(1000);
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"拿到了第"+ ticketNums-- +"张票");
          //  System.out.println(ticketNums);
        }`

以上代码段才是正确的逻辑 但是输出结果是
在这里插入图片描述
居然有黄牛党和老师同时都拿到了第7张票 这是不应该的呀

我是一步步改代码 票的数量才能一步步实现递减 最终代码是这样的


//多个线程同时操作一个对象
//买过车票的例子
public class TestThread4 implements Runnable {
    
    
    //票数
    public int ticketNums = 10;

    @Override
    public void run() {
    
    
        while (ticketNums>2){
    
    
//            if(ticketNums == 0){
    
    
//                break;
//            }
            try {
    
    
                Thread.sleep(1000);
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"拿到了第"+ ticketNums-- +"张票");
          //  System.out.println(ticketNums);
        }
    }
    public static void main(String[] args)  {
    
    
        TestThread4 ticket = new TestThread4();
        new Thread(ticket,"小明").start();
        try {
    
    
            Thread.sleep(10);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        new Thread(ticket,"老师").start();
        try {
    
    
            Thread.sleep(10);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        new Thread(ticket,"黄牛党").start();
        try {
    
    
            Thread.sleep(10);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
    }


请前辈给指点一下 , 我是怀疑现在的处理器速度太快,会不会是两个线程同时对ticketNum操作了 
才导致不能正确输出结果。

我通过改while循环的判断条件 和 增加每个线程之间开始的时间 才解决的问题  但是逻辑上没问题的呀

最后在群里请教了同学,加个锁就好了 代码如下


package testThread;

//多个线程同时操作一个对象
//买过车票的例子
public class TestThread4 implements Runnable {
    
    


    //票数
    private static volatile int ticketNums = 10;
    private static Object obj = new Object();
    @Override
    public void run() {
    
    
        while (true){
    
    
            if(ticketNums<=0){
    
    
                break;
            }
            try {
    
    
                Thread.sleep(1000);
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        synchronized (obj){
    
    
                if(ticketNums > 0){
    
    

                    System.out.println(Thread.currentThread().getName()+"拿到了第"+ ticketNums-- +"张票");
                }else {
    
    
                    System.out.println("谢谢惠顾");
                }
        }

        }
    }

    public static void main(String[] args) {
    
    
        TestThread4 ticket = new TestThread4();
        new Thread(ticket,"小明").start();

        new Thread(ticket,"老师").start();

        new Thread(ticket,"黄牛党").start();
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37412975/article/details/114154455