就假设ticket=1,有四个线程卖票,首先明确:(1)没有对共享数据加锁,任一线程只要拿到执行权都可以走到while语句里面
(2)sleep()的作用:释放CPU执行权,不释放锁,此案例无锁,当执行到sleep(long time)时,线程放弃CPU执行权
(3)ticket--动作是在sleep()之后执行的,当线程执行到sleep()被冻结以后,ticket的值还是为1.
(4)ticket--动作等同于ticket=ticket--,把ticket的值赋给左边以后,才自减一次
用以下较为极端的一个场景描述:
Thread-0拿到CPU执行权,到sleep(10)被冻结,被Thread-1抢到执行权;
Thread-1执行到sleep(10)也冻结,Thread-2抢到执行权;
Thread-2执行到sleep(10)冻结,Thread-3抢到执行权;
Thread-3执行到sleep(10)冻结;
假若Thread-3冻结以后,sleep()的时间才到,那么第一个被等待的线程Thread-0又重新拿到执行权,执行打印语句,打印为1
后面的相继醒过来,就出现了0,-1,-2
|