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

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

關于線程的一個問題

關于線程的一個問題

我要變大神大神大大神 2016-12-30 13:56:00
賣票的問題,4個線程一起買100張票 public?class?Ticket?implements?Runnable?{ private?int?num?=?100; Object?obj?=?new?Object(); @Override public?void?run()?{ while?(true){ try{ Thread.sleep(10); }catch(InterruptedException?e){} if?(num?>?0){ System.out.println(Thread.currentThread().getName()+"...sale..."+num--); } } } } ----- public?class?TicketDemo?{ public?static?void?main(String[]?args)?{ Ticket?t?=?new?Ticket(); Thread?t1?=?new?Thread(t); Thread?t2?=?new?Thread(t); Thread?t3?=?new?Thread(t); Thread?t4?=?new?Thread(t); t1.start(); t2.start(); t3.start(); t4.start(); } } 運行結果:為什么同一張票會被重復賣出去?,我想知道造成這一現象的原因和過程講解,求大神指導。 ? ? ? 我知道加個同步鎖就沒事啦~ ? ?可是我就想知道造成這一現象的過程和原因
查看完整描述

3 回答

已采納
?
四無小青年

TA貢獻88條經驗 獲得超43個贊

四個線程,每個線程都會讀取并打印num然后把num-1?,F在想象這么一種情況,線程一讀取了num=96,還沒來得及打印和執行--操作,線程二也讀取了num=96,這樣就會造成問題所提情況。由于你沒有加鎖所以線程對num變量的讀寫是無序,他們并不會一個一個的自發排隊去讀寫這個數,而是隨意讀寫數據,這就會造成數據之間的讀寫不同步。若解惑,望采納

查看完整回答
反對 回復 2016-12-30
?
習慣受傷

TA貢獻885條經驗 獲得超1144個贊

1、你的代碼邏輯有問題,為什么呢?你的每個Ticket線程內都有100張票,也就是樓上說的400張票,所以重復是肯定的。

2、如果讓這4個線程同時競爭這100張票,先讓他們共享這個資源。

3、同步可以用 synchronized 關鍵字實現。


查看完整回答
1 反對 回復 2016-12-30
  • 四無小青年
    四無小青年
    樓主的邏輯沒錯,是你們的Java線程基礎沒學到家。在new Thread(Runnable)時,樓主傳的是同一個Runnable任務,所以會創建出來的線程會共享這個Runnable任務的變量,這是多線線程基礎知識,不信你自己去試試。
?
silencecorner

TA貢獻10條經驗 獲得超3個贊

肯定要做同步處理的,正在買票的時候其他線程就不能對num進行操作。最大的一個問題就是你賣的是400張票!

查看完整回答
反對 回復 2016-12-30
  • 3 回答
  • 0 關注
  • 1416 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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