synchronized修飾方法到底鎖住的是什麼

本文參看http://blog.csdn.net/shenshibaoma/article/details/53009505

我們先給出本文的結論,synchronized修飾方法鎖住的是對象的本身,也是this。

下面我們通過代碼來驗證。

public class Test164 {
   public static void main(String[] args) {
    MyThread999 m9 = new MyThread999();
    Thread t = new Thread(m9);
    Thread t1 = new Thread(m9);
    t.start();
    t1.start();
    System.out.println();
  }

    public synchronized void show () {
     for(int i = 0;i<10;i++) {
        System.out.println(Thread.currentThread().getName()+"  "+i);
        }
    }
}

class MyThread999 implements Runnable{
     //Test164 t = new Test164();
    @Override
    public void run() {
        // TODO Auto-generated method stub
        Test164 t = new Test164();
        t.show();
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
上述代碼運行的結果:

我們可以看到似乎加synchronized 修飾方法,沒有同步的效果。回到我們本文主題,synchronized 修飾的方法,鎖住的是Test164的對象,而調用線程start,每次執行run方法,都是創建一個新的Test164的對象,你說鎖住的不是同一個,有什麼用。

基於上面,我們做如下的修改:

class MyThread999 implements Runnable{
     //Test164 t = new Test164();
    @Override
    public void run() {
        // TODO Auto-generated method stub
        t.show();
    }

}
1
2
3
4
5
6
7
8
9
這樣就能保證鎖住是同一個Test164對象。
————————————————
版權聲明:本文爲CSDN博主「venus321」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/venus321/article/details/79213516

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章