问答详情
源自:2-3 应用Runnable模拟卖票

这个结果该如何分析呢?有两个剩余票数为2

窗口1卖了1张火车票,还剩票数:2 

窗口1卖了1张火车票,还剩票数:1 

窗口1卖了1张火车票,还剩票数:0 

窗口3卖了1张火车票,还剩票数:2 

窗口2卖了1张火车票,还剩票数:3 


 这个结果该如何分析呢?有两个剩余票数为2

提问者:建立 2019-04-28 01:40

个回答

  • 斌哥在此
    2020-12-01 14:14:01

    这都是线程不安全导致的

  • 慕慕0120168
    2019-08-05 22:45:37

    视频中 ticketsCont-- 是一个复合操作在多线程下可能交叉运行,内存可见性问题,可以学习这节课程 https://www.imooc.com/learn/352

  • 灵谷鱼
    2019-07-25 20:58:43

    我也出现这种问题了?

  • likecutie
    2019-05-19 16:09:08

    课程中的代码本身就没有考虑线程安全问题,解决这个问题请搜索“线程安全”,以下内容是解释你的程序运行结果(可能过程,因为多线程过程很复杂):

    窗口3获得运行机会,判断此时剩余5张可以卖票,但此时被窗口2抢去了运行机会,窗口3减减得到4张余票,但是窗口1又抢得了机会,减减得到3张余票,此时3继续运行,打印出余票3,窗口1和窗口2都打印了余票2,接下来的执行就和课程的差不多了。

    这里如果考虑到原子操作,就不会出现你的这种问题,而你的这种问题出现的几率很小,因为程序运行很快,分配的一点点时间片在此案例中的一个线程很容易就能执行完,就算执行不完,出现以上问题的概率也小。