免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
為什么JAVA要提供 wait/notify 機(jī)制?是為了避免輪詢帶來的性能損失
我好土,真的。學(xué)用了四五年的JAVA,還從沒用過 wait/notify,也不清楚它跟synchronized 關(guān)鍵字 相比有什么好處。今天查了些資料,終于明白了:wait/notify  機(jī)制是為了避免輪詢帶來的性能損失。 

    為了說清道理,我們用“圖書館借書”這個經(jīng)典例子來作解釋。 
    一本書同時只能借給一個人?,F(xiàn)在有一本書,圖書館已經(jīng)把這本書借了張三。 
    在簡單的synchrnozed 同步機(jī)制下,李四如果想借,先要去圖書館查看書有沒有還回來。李四是個心急的人,他每天都去圖書館查;而張三看書看得慢,過了半個月才把書還回來,結(jié)果李四在這半個月里全都白跑了,浪費(fèi)了不少交通車費(fèi) 
    而如果使用wait/notify機(jī)制,李四就不用白忙了。他第一次去圖書館時發(fā)現(xiàn)書已借走,就回家靜靜等待(wait);張三把書還掉后,通知(notify)李四,李四去圖書館拿書即可。整個過程中,李四沒有白跑,沒浪費(fèi)錢。 
    回到計算機(jī)世界: 
    
       書                   --  臨界資源,需互斥地訪問
    張三,李四          --  兩個競爭的線程 
坐車去圖書館查書     --  輪詢 
      車費(fèi)                 --  CPU空間 
      等待                 --  wait 
  通知下一個借書者   --  notify
 
    也就是說,若使用簡單的synchonized機(jī)制實(shí)現(xiàn)互斥,會導(dǎo)致線程主動發(fā)起輪詢,若N次輪詢沒有成功,就產(chǎn)生了N次的CPU空間浪費(fèi);如果加上了 wait/notify機(jī)制,就可以避免這些無謂的輪詢,節(jié)省CPU的消耗。

http://chenjianjx.javaeye.com/blog/230465

附:

java,wait與notify的區(qū)別
wait與notify是java同步機(jī)制中重要的組成部分。結(jié)合與synchronized關(guān)鍵字使用,可以建立很多優(yōu)秀的同步模型。
     synchronized(this){}等價與public synchronized void method(){.....}
     同步分為類級別和對象級別,分別對應(yīng)著類鎖和對象鎖。類鎖是每個類只有一個,如果static的方法被synchronized關(guān)鍵字修飾,則在這個方法被執(zhí)行前必須獲得類鎖;對象鎖類同。(static synchronized是類級別的,非static的synchronized和synchronized塊都是對象級別的,即作用在同一new出來的對象上)
     首先,調(diào)用一個Object的wait與notify/notifyAll的時候,必須保證調(diào)用代碼對該Object是同步的,也就是說必須在作用等同于synchronized(obj){......}的內(nèi)部才能夠去調(diào)用obj的wait與notify/notifyAll三個方法,否則就會報錯:
     java.lang.IllegalMonitorStateException: current thread not owner
     在調(diào)用wait的時候,線程自動釋放其占有的對象鎖,同時不會去申請對象鎖。當(dāng)線程被喚醒的時候,它才再次獲得了去獲得對象鎖的權(quán)利。
     所以,notify與notifyAll沒有太多的區(qū)別,只是notify僅喚醒一個線程并允許它去獲得鎖,notifyAll是喚醒所有等待這個對象的線程并允許它們?nèi)カ@得對象鎖,只要是在synchronied塊中的代碼,沒有對象鎖是寸步難行的。其實(shí)喚醒一個線程就是重新允許這個線程去獲得對象鎖并向下運(yùn)行。
       順便說一下notifyall,雖然是對每個wait的對象都調(diào)用一次notify,但是這個還是有順序的,每個對象都保存這一個等待對象鏈,調(diào)用的順序就是這個鏈的順序。其實(shí)啟動等待對象鏈中各個線程的也是一個線程,在具體應(yīng)用的時候,需要注意一下。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
sleep()和wait()有什么區(qū)別
Thinking in Java 13.并發(fā)編程 線程間的協(xié)作
java線程的幾個概念和方法
Java基礎(chǔ)之多線程,看完以后既然感覺這么簡單?
整理總結(jié)Java多線程程序編寫的要點(diǎn)
java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 - 攻城師 - ITeye技術(shù)網(wǎng)站
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服