窗口1卖了1张火车票,还剩票数:2
窗口1卖了1张火车票,还剩票数:1
窗口1卖了1张火车票,还剩票数:0
窗口3卖了1张火车票,还剩票数:2
窗口2卖了1张火车票,还剩票数:3
这个结果该如何分析呢?有两个剩余票数为2
这都是线程不安全导致的
视频中 ticketsCont-- 是一个复合操作在多线程下可能交叉运行,内存可见性问题,可以学习这节课程 https://www.imooc.com/learn/352
我也出现这种问题了?
课程中的代码本身就没有考虑线程安全问题,解决这个问题请搜索“线程安全”,以下内容是解释你的程序运行结果(可能过程,因为多线程过程很复杂):
窗口3获得运行机会,判断此时剩余5张可以卖票,但此时被窗口2抢去了运行机会,窗口3减减得到4张余票,但是窗口1又抢得了机会,减减得到3张余票,此时3继续运行,打印出余票3,窗口1和窗口2都打印了余票2,接下来的执行就和课程的差不多了。
这里如果考虑到原子操作,就不会出现你的这种问题,而你的这种问题出现的几率很小,因为程序运行很快,分配的一点点时间片在此案例中的一个线程很容易就能执行完,就算执行不完,出现以上问题的概率也小。