1. 程式人生 > >【面試題】多執行緒在執行過程中,某個執行緒執行時,突然釋放鎖。會發生的特殊狀態

【面試題】多執行緒在執行過程中,某個執行緒執行時,突然釋放鎖。會發生的特殊狀態

一,背景

今天在刷面試題的時候,做到一道面試題,雖然看了答案,但有一個答案還是不理解。後來研究了一下,得到結論:執行緒拿到鎖進行執行時,哪怕獲得了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執行緒才會繼續往下執行。

結論:當執行緒在執行過程中,需要要持有鎖,才能繼續往下執行。