有點(diǎn)小伙伴試了下,出現(xiàn) 3 3 2 0 1 這種不符合常理的結(jié)果,沒有達(dá)到預(yù)想中的4 3 2 1 0這就是線程的交互執(zhí)行導(dǎo)致的;舉個例子:線程1先執(zhí)行賣了1張票,也即是票--1,現(xiàn)在票為4,但是這個線程還沒沒有來得及在控制臺打印出剩余多少票,線程又搶到了CPU資源執(zhí)行,線程2又把票--1;此時票為3,線程2輸出票就為3,線程2執(zhí)行完了后,線程1又再次獲得CPU資源,繼續(xù)把剛剛沒有輸出的話輸出,但是此時票已經(jīng)為3了,于是又輸出了3。 看過多線程的小伙伴應(yīng)該不難理解,這就是線程不安全,想要保證輸出結(jié)果,可以使用synchronized關(guān)鍵字來解決
2017-01-10
沒有對票數(shù)這個多線程共同訪問的數(shù)據(jù)進(jìn)行同步,使得每一個線程都有自己的一個數(shù)據(jù)源
2016-12-11
把售票的方法提取出來,再加上synchronized關(guān)鍵字,執(zhí)行的時候就不會出錯了
@Override
public void run() {
shoupiao();
}
public synchronized void shoupiao(){
while(ticketCount>0){
ticketCount--;
System.out.println(Thread.currentThread().getName()+"賣出了1張票,剩余"+ticketCount+"張票");
}
@Override
public void run() {
shoupiao();
}
public synchronized void shoupiao(){
while(ticketCount>0){
ticketCount--;
System.out.println(Thread.currentThread().getName()+"賣出了1張票,剩余"+ticketCount+"張票");
}
2016-11-27