打印出六條結(jié)果
窗口1賣(mài)出一張票,剩余票數(shù)為:4
窗口3賣(mài)出一張票,剩余票數(shù)為:3
窗口2賣(mài)出一張票,剩余票數(shù)為:4
窗口3賣(mài)出一張票,剩余票數(shù)為:1
窗口1賣(mài)出一張票,剩余票數(shù)為:2
窗口2賣(mài)出一張票,剩余票數(shù)為:0
這是什么情況?
窗口1賣(mài)出一張票,剩余票數(shù)為:4
窗口3賣(mài)出一張票,剩余票數(shù)為:3
窗口2賣(mài)出一張票,剩余票數(shù)為:4
窗口3賣(mài)出一張票,剩余票數(shù)為:1
窗口1賣(mài)出一張票,剩余票數(shù)為:2
窗口2賣(mài)出一張票,剩余票數(shù)為:0
這是什么情況?
2016-02-21
舉報(bào)
2016-07-20
2016-02-21
這個(gè)是由于ticket--不是原子操作導(dǎo)致的,簡(jiǎn)單點(diǎn)解釋就是當(dāng)執(zhí)行自減操作時(shí)在cpu內(nèi)部是分了多個(gè)指令步驟執(zhí)行的(假設(shè)步驟為1.先從內(nèi)存讀取數(shù)據(jù)。2.將讀取的數(shù)據(jù)減一.3.返回?cái)?shù)據(jù))。此時(shí)你的執(zhí)行結(jié)果就很明白了:程序一開(kāi)始,窗口1獲取先cpu后執(zhí)行到步驟1,此時(shí)又把控制權(quán)交到了窗口2,而且窗口2也剛好執(zhí)行到步驟1.然后程序1繼續(xù)執(zhí)行,從而數(shù)據(jù)錯(cuò)誤。解決辦分兩種:1.將ticket的類型修改為AtomicInteger類型的。2.對(duì)票數(shù)做減法處理時(shí)加鎖。