本文來自于讀刃溲馈:http://blog.csdn.net/lingzhm,原博客更精髓抱完。
wait()方法——暫停當前線程贼陶,釋放當前鎖刃泡,線程進入等待狀態(tài)巧娱;
notify()方法——執(zhí)行完畢當前代碼塊后碉怔,釋放鎖,喚醒在等待狀態(tài)的線程()禁添;(如果又多個需要相同鎖的等待線程撮胧,會隨機喚醒其中一個)
notifyAll()方法——當前代碼塊執(zhí)行完畢,釋放鎖老翘,喚醒在等待狀態(tài)的所有線程()芹啥;
以上方法都是相對于synchronized代碼塊中調用。
線程安全問題:多線程在調用同一個方法铺峭,或者多個方法時候的時候墓怀,運行得出錯誤的結果或者數據錯誤。
如何處理線程安全問題卫键?
采用序列化訪問臨界資源傀履,幾同一時間只能有一個線程訪問該方法。
示例說明:小米盒子通過USB看門狗以及顯示屏幕莉炉,對看門的控制的時候需要經命令寫入看門狗執(zhí)行區(qū)钓账,
例如 ?12345--開啟看門狗
? ? ? ? ? 6789--關閉屏幕
如果多線程同時調用開啟動看門狗以及關閉看門狗的方法時,在執(zhí)行區(qū)可能會形成167893456不是別的亂碼絮宁,
這是我們就需要采用synchronized來修飾方法或者代碼塊梆暮。
死鎖現象:(只有一個車能經過的馬路,兩輛互不相讓的車在同時經過這條馬路的時候就會一直僵持下去绍昂,誰也走不了了啦粹,這個比喻不是很恰當。窘游。卖陵。。)张峰;
直接看圖:
解說:首先度對左側這一個線程進行說明:在具有鎖1代碼塊中包含具有鎖2的代碼塊
右側線程說明:在具有鎖2代碼塊中包含具有鎖1的代碼塊
當兩個線程同時執(zhí)行到綠色橫線位置的時候泪蔫,
左側線程:當前具有鎖1,并且需要鎖2喘批,才能繼續(xù)執(zhí)行撩荣,否則將無法像下執(zhí)行。
右側線程:當前具有鎖2饶深,并且需要鎖1餐曹,才能繼續(xù)執(zhí)行。
由于鎖2在右側線程中敌厘,并且當前無法釋放台猴,導致左側線程無法執(zhí)行下去,
同樣由于鎖1在左側線程中,并且當前無法釋放饱狂,導致右側線程無法釋放曹步。
結果導致兩個線程都無法執(zhí)行下去,稱為死鎖現象
如何處理死鎖現象休讳?
筆者認為首先要在邏輯上防止情況的發(fā)生讲婚。
可以采用超時判斷
若有錯誤之處,請給予指示俊柔,謝謝~~~~~