當前位置:
首頁 > 知識 > 聊聊synchronized的鎖問題

聊聊synchronized的鎖問題

本文不會特別深入細緻地討論synchronized,只是做一個通俗易懂的說明,以及看清一類問題的本質,希望能給大家一點啟發。

問題描述

有一個類A,提供了三個方法。分別是靜態同步方法,非靜態同步方法,含有靜態代碼塊的方法

1 class A{
2 public static synchronized void print1{
3 print;
4 }
5 public synchronized void print2{
6 print;
7 }
8 public void print3{
9 synchronized (new Object){
10 print;
11 }
12 }
13 private static void print{
14 while(true){
15 String threadName = Thread.currentThread.getName;
16 System.out.println(threadName);
17 }
18 }
19 }

請回答一下四種情況的輸出結果

1 class Test {
2 // 1.兩個線程,同一個類,調用靜態同步方法print1
3 @Test
4 public void test1 {
5 Thread thread1 = new Thread( -> A.print1);
6 Thread thread2 = new Thread( -> A.print1);
7 thread1.start;
8 thread2.start;
9 }
10 // 2.兩個線程,同一個對象,調用非靜態同步方法print2
11 @Test
12 public void test2 {
13 A a = new A;
14 Thread thread1 = new Thread( -> a.print2);
15 Thread thread2 = new Thread( -> a.print2);
16 thread1.start;
17 thread2.start;
18 }
19 // 3.兩個線程,不同對象,調用非靜態同步方法print2
20 @Test
21 public void test3 {
22 Thread thread1 = new Thread( -> new A.print2);
23 Thread thread2 = new Thread( -> new A.print2);
24 thread1.start;
25 thread2.start;
26 }
27 // 4.兩個線程,同一個對象,調用普通非靜態方法(帶有同步代碼塊)print3
28 @Test
29 public void test4 {
30 A a = new A;
31 Thread thread1 = new Thread( -> a.print3);
32 Thread thread2 = new Thread( -> a.print3);
33 thread1.start;
34 thread2.start;
35 }
36 }

問題答案

先直接報上答案:

  1. 一直輸出「Thread-1」
  2. 一直輸出「Thread-1」
  3. 交替輸出「Thread-1」和「Thread-2」
  4. 交替輸出「Thread-1」和「Thread-2」

問題本質分析

不廢話,直接點出,這四個問題只要明白兩件事即可:

  • 一個線程是否能執行被同步了的方法,主要看是否能拿到鎖對象
  • 靜態方法的同步鎖是

    類對象

    本身,非靜態方法的同步鎖是

    實例對象

    本身,同步代碼塊的同步鎖是括弧中

    傳入的對象

所以

  • 如果兩個線程執行方法用到了同一個鎖對象,則一個線程執行時,另一個線程必須等待其釋放鎖才能拿到鎖,所以此時兩個線程會互斥

所以

  • 1中兩個線程執行方法的鎖對象都是

    類對象A

    ,所以線程之間互斥
  • 2中兩個線程執行方法的鎖對象都是

    實例對象a

    ,所以線程之間互斥
  • 3中兩個線程執行方法的鎖對象分別是

    new出來的兩個

    實例對象a,所以線程互不影響
  • 4中兩個線程執行方法的鎖對象分別是

    new出來的兩個

    實例對象object,所以線程互不影響

Game Over

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

基於三台主機部署phpwind

TAG:科技優家 |

您可能感興趣

聊聊hikari與tomcat jdbc pool的fail fast
在 adidas Originals Arkyn Party 上,我們聊聊了「女性平權」和「潮流文化」
看了木村拓哉 x 竇靖童的廣告嗎?來聊聊Levi』s Vintage Clothing
聊聊英國的Quaker school
和 Geoffery Hinton 面對面聊聊
For daugthers:這一天想和Mom聊聊關於美麗的秘密
聊聊Cloud Foundry開源PaaS雲平台
鞋先生和您聊聊 Nike Air Jordan 1 的進化歷史
今天聊聊Teacher』spet這個話題
Turbo Charger!聊聊快充技術
特別篇/聊聊ChinaJoy
由淺入深聊聊SAP Cloud Platform
在Blazer Mid發售前,聊聊sacai是如何通吃時裝與街頭的
真的是為了交朋友 聊聊Nokia 8 Sirocco旗艦機
獨家專訪Levi s現任品牌歷史官Tracey Panek,聊聊時尚圈的復古回潮
聊聊 WWDC19 的一項重大發布:「Sign in with Apple」
聊聊FromSoftware繼黑魂後新作《只狼》與《Deracine》的最新預告
Apple Store 入華十年,聊聊你與 Ta 的故事
聊聊美國職業選擇和規劃career path
【Luxury Rebel 】時尚博主SherrySS醬上線 | 來聊聊出席婚禮的鞋履怎麼選