测试积点老人 发表于 2022-1-25 10:41:07

Synchronized加锁后为什么还会出现意想不到的的情况?

问题遇到的现象和发生背景最近刚开始学java的Synchronized关键字,了解到互斥锁,测试了一下,但是结果却跟学到的不一样,我模拟的是卖票的情况,退出条件为卖完即退出,大多数情况下都能正常,但是多测几次发现会出现超卖的情况,谁能帮忙解答一下吗?package concurrent;
public class SellTicketTest {
    public static void main(String[] args) {
      SellTicket sellTicket = new SellTicket();
      Thread thread = new Thread(sellTicket);
      Thread thread1 = new Thread(sellTicket);
      Thread thread2 = new Thread(sellTicket);
      Thread thread3 = new Thread(sellTicket);
      thread3.start();
      thread.start();
      thread1.start();
      thread2.start();
    }
}
class SellTicket implements Runnable{
    private int ticketNum=100;
    private boolean loop=true;
    public synchronized void sell(){//加锁的位置
            System.out.println(Thread.currentThread().getName() + "窗口卖出一张票" + "还剩下" + (--ticketNum) + "张票");
            if(ticketNum<=0){//退出的条件
                System.out.println("售票结束");
                loop=false;
      }
    }
    @Override
    public void run() {
      while (loop){
            sell();
         }
    }
}运行结果及报错内容Thread-2窗口卖出一张票还剩下1张票
Thread-2窗口卖出一张票还剩下0张票
售票结束
Thread-1窗口卖出一张票还剩下-1张票
售票结束
Thread-0窗口卖出一张票还剩下-2张票
售票结束
Thread-3窗口卖出一张票还剩下-3张票
售票结束我的解答思路和尝试过的方法本以为是加锁的位置不对,或者是创建了不同的对象,但是检查后发现并没有创建多个对象我想要达到的结果有哪位能指点迷津吗?感谢感谢

kallinr 发表于 2022-1-26 09:22:13

:)

qqq911 发表于 2022-1-26 10:24:47

看数量的判断是最后还是一开始

郭小贱 发表于 2022-1-26 15:19:53

https://www.cnblogs.com/sirliu/archive/2015/02/16/sirliu_about_synchronized.html参考了解下。

jingzizx 发表于 2022-1-26 17:21:04

一样,你要看加锁以后的状态变化
页: [1]
查看完整版本: Synchronized加锁后为什么还会出现意想不到的的情况?