【面試題】多執行緒在執行過程中,某個執行緒執行時,突然釋放鎖。會發生的特殊狀態
阿新 • • 發佈:2018-11-22
一,背景
今天在刷面試題的時候,做到一道面試題,雖然看了答案,但有一個答案還是不理解。後來研究了一下,得到結論:執行緒拿到鎖進行執行時,哪怕獲得了CPU執行權,但是那個鎖不能丟失,它後面執行的過程都需要帶著鎖,才能往下繼續執行。
二,測試程式碼
/** * */package 測試多執行緒wait和notify問題; /** * @author: KOLO * @date:2018年9月26日 下午3:01:02 * @version: 1.0 */ public class Test { final static Object obj = new Object(); public static void main(String[] args) { Thread t1 = new Thread() { @Override public void run() { synchronized(obj) { try { System.out.println("哈哈哈!!!========="); obj.wait(); System.out.println("我是t1!!!========="); }catch (Exception e) { e.printStackTrace(); } } } }; t1.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } Thread t2 = new Thread() { @Override public void run() { synchronized(obj) { obj.notifyAll(); System.out.println("我是T2!!!"); System.out.println("釋放鎖了!"); } } }; t2.start(); } }
上面程式碼的執行流程如上圖所示:
①紅色塊代表程式碼的執行流程
②紫色區域代表問題區域:在這個紫色區域,哪怕是執行緒T1拿到了cpu的執行權,但是也不會執行程式碼,因為它沒有鎖。最後還是要執行緒T2釋放了鎖,T1執行緒才會繼續往下執行。
結論:當執行緒在執行過程中,需要要持有鎖,才能繼續往下執行。