有趣的8鎖問題

2021-10-08 02:18:11 字數 2318 閱讀 5473

話不多說,直接上**

//資源類

class phone

//同步方法

public synchronized void sms() throws interruptedexception

}

測試類,定義兩個執行緒

public class test  catch (interruptedexception e) 

},「a」).start();

new thread(()-> catch (interruptedexception e)

},「b」).start();

}}

列印的是什麼

email....

sms....

結論:鎖的是this,也就是方法的呼叫者。

解釋:當a執行緒呼叫email方法,會獲得鎖,也就是當前物件,此時b執行緒沒辦法得到鎖,就只有等待,直到a執行緒釋放鎖。所以列印email,sms

接下來看看這個

class phone

//同步方法

public synchronized void sms() throws interruptedexception

}

public class test  catch (interruptedexception e) 

}).start();

new thread(()-> catch (interruptedexception e)

}).start();

}}

sms....

email....

解釋:當a執行緒呼叫email方法,因為是靜態的,鎖的是class物件,b執行緒鎖的是例項物件,所不一樣,所以互不影響。但是a執行緒睡了4秒,所以列印sms,email

接下來看看這個

class phone

public synchronized void sms() throws interruptedexception

}

public class test  catch (interruptedexception e) 

}).start();

new thread(()-> catch (interruptedexception e)

}).start();

}}

email....

sms....

解釋:當a執行緒呼叫email方法,鎖的是phone物件,b執行緒鎖的是phone1物件,鎖不一樣,所以互不影響。所以列印sms,email

接下來看看這個

class phone

public synchronized void sms() throws interruptedexception

public void hello()

}

public class test  catch (interruptedexception e) 

}).start();

new thread(()->).start();

}}

email....

hello....

解釋:當a執行緒呼叫email方法,鎖的是phone物件,b執行緒沒有加鎖,所以互不影響。所以打email,hello

接下來看看這個

class phone

public static synchronized void sms() throws interruptedexception

}

public class test  catch (interruptedexception e) 

}).start();

new thread(()->).start();

}}

解釋:當a執行緒呼叫email方法,鎖的是class物件,b執行緒sms方法,鎖的是class物件,是同乙個物件。所以打email,sms

是不是很有趣啊~~~~~哈哈

8鎖,就是關於鎖的8個問題

class phone public synchronized void call class test,a start 捕獲 try catch interruptedexception e new thread b start 兩個方法用的是同乙個鎖,排隊執行 class phone catch...

有趣的問題

1,有趣問題2 執行一遍下面的 列印的是0,為什麼,然後再執行一遍注釋掉的 結果卻是60 package othertest public class mytest public static void main string args 2,有趣問題1 為什麼這個tmp引數在reversestrin...

有趣的問題

include using namespace std 寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。可以參考電子技術的全加法器利用位運算完成操作 int add int a,int b return sum 解法2 intadd int num1,int num2 return...