亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

這段java多線程代碼有問題嗎?

這段java多線程代碼有問題嗎?

胡子哥哥 2019-04-09 20:25:28
publicclassMain{publicstaticvoidmain(String[]args){MyThreadmt=newMyThread();newThread(mt).start();newThread(mt).start();newThread(mt).start();}}classMyThreadimplementsRunnable{privateintticket=20;publicvoidrun(){for(inti=0;i0){System.out.println("線程:"+Thread.currentThread().getName()+"賣票:ticket"+this.ticket--);}}}}
查看完整描述

2 回答

?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

不知道你想要干什么。不過要是買票,可能下面才是對的。
publicsynchronizedvoidrun()....
                            
查看完整回答
反對 回復 2019-04-09
?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

你這個涉及到一個共享變量的問題,ticket變量被三個線程同時訪問,就可能導致多個線程讀到同樣的值,這顯然是錯誤的。而且這只是其中一種情況。更復雜的是--操作并不是原子的,這就會產生另一種情況,如果ticket不是int,而是long,遞增/遞減是分步進行的,這中間可能另一個線程同時向ticket寫值,從而產生更離奇的輸出。
所以就要對共享變量進行同步控制,synchronized可以用在方法上,也可以以同步塊的方式進行。更簡單的上使用java.util.concurrent.atomic.AtomicInteger,它提供原子的遞增/遞減方法。
而且,在輸出的地方也會出問題。因為字符串的拼接也不是原子的,所以肯出現輸出混亂的情況。
                            
查看完整回答
反對 回復 2019-04-09
  • 2 回答
  • 0 關注
  • 376 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號