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

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

關于Java多線程鎖的問題

關于Java多線程鎖的問題

hy_wang 2017-08-17 10:03:46
/** ?*?宇宙的能量系統 ?*?遵循能量守恒定律: ?*?能量不會憑空創生或消失,只會從一處轉移到另一處 ?*/ public?class?EnergySystem?{ //能量盒子,能量存貯的地方 ?private?final?double[]?energyBoxes; ?private?final?Object?lockObj?=?new?Object(); ? ?/** ??*? ??*?@param?n????能量盒子的數量 ??*?@param?initialEnergy?每個能量盒子初始含有的能量值 ??*/ ?public?EnergySystem(int?n,?double?initialEnergy){ ?energyBoxes?=?new?double[n]; ?for?(int?i?=?0;?i?<?energyBoxes.length;?i++) ?energyBoxes[i]?=?initialEnergy; ?} ? ?/** ??*?能量的轉移,從一個盒子到另一個盒子 ??*?@param?from?能量源 ??*?@param?to?????能量終點? ??*?@param?amount?能量值 ??*/ ?public?void?transfer(int?from,?int?to,?double?amount){ ? ?synchronized(lockObj){ ? //while循環,保證條件不滿足時任務都會被條件阻擋 ?//而不是繼續競爭CPU資源 ?while?(energyBoxes[from]?<?amount){ ?try?{ //條件不滿足,?將當前線程放入Wait?Set lockObj.wait(); }?catch?(InterruptedException?e)?{ e.printStackTrace(); } ?} ? ? ?System.out.print(Thread.currentThread().getName()); ?energyBoxes[from]?-=?amount; ?System.out.printf("從%d轉移%10.2f單位能量到%d",?from,?amount,?to); ?energyBoxes[to]?+=?amount; ?System.out.printf("?能量總和:%10.2f%n",?getTotalEnergies()); //喚醒所有在lockObj對象上等待的線程 ?lockObj.notifyAll(); ?} ? ?} ? ?/** ??*?獲取能量世界的能量總和? ??*/ ?public?double?getTotalEnergies(){ ?double?sum?=?0; ?for?(double?amount?:?energyBoxes) ?sum?+=?amount; ?return?sum; ?} ? ?/** ??*?返回能量盒子的長度 ??*/ ?public??int?getBoxAmount(){ ?return?energyBoxes.length; ?} ? }請問關于這段代碼 ?如果滿足energyBoxes[from] < amount的while循環 ?則線程被堵塞我想問的是 如果之后使用lockObj.notifyAll();喚醒等待線程之后,再去競爭CPU資源。這樣的話她不是還滿足while循環最終面臨的還是被鎖,請問這個意義何在?;蛘邞撊绾卫斫?
查看完整描述

1 回答

  • 1 回答
  • 1 關注
  • 1439 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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