synchronized鎖重入問題

隱0士發表於2020-10-25

先說結論:一個執行緒得到了一個物件的方法後,還可以呼叫這個物件的其他加鎖的方法,一個執行緒執行在進入了子類的方法後,還可以呼叫父類的加鎖方法。

如下面所示:

package com.lydon.thread;

public class SyncDubbo {

    public synchronized void method1(){
        System.out.println("i am method1");
        method2();
    }

    public synchronized void method2(){
        System.out.println("i am method2");
        method3();
    }

    public synchronized void method3(){
        System.out.println("i am method3");
    }

    public static void main(String[] args) {
        final SyncDubbo syncDubbo = new SyncDubbo();
        Runnable target;
        Thread thread=new Thread(new Runnable() {
            public void run() {
                syncDubbo.method1();
            }
        });
        thread.start();
    }
}

輸出結果為:

i am method1
i am method2
i am method3

 

同樣的,對於子類呼叫父類的同步方法,也是可以的

package com.lydon.thread;

public class SyncDubbo2 {

    static class Main{
        public int num=10;
        public synchronized void operationSup(){
            try {
                num--;
                System.out.println("Main print i ="+num);
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

    static class SubMain extends Main{
        public synchronized void operationSub(){
            try {
                while (num>0){
                    num--;
                    System.out.println("SubMain print i ="+num);
                    Thread.sleep(200);
                    this.operationSup();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        final SyncDubbo2.SubMain subMain = new SyncDubbo2.SubMain();
        Runnable target;
        Thread thread=new Thread(new Runnable() {
            public void run() {
                subMain.operationSub();
            }
        });
        thread.start();
    }


}

一定要保證子類父類都是synchronized修飾的,不然就會出現執行緒 安全問題

相關文章