1. 程式人生 > >深入理解Java中的synchronized鎖重入

深入理解Java中的synchronized鎖重入

問題匯入:如果一個執行緒呼叫了一個物件的同步方法,那麼他還能不能在呼叫這個物件的另外一個同步方法呢?

這裡就是synchronized鎖重入問題。

一.synchronized鎖重入

 來看下面的程式碼:

.這個是三個同步方法的類

複製程式碼

public class Synfun_UseSynfun{
    //同步方法1
    public synchronized  void fun1(){
        System.out.println("我是一號同步方法");
        this.fun2();//呼叫二號同步方法
    }
    //同步方法2
    public synchronized void fun2(){
        System.out.println("我是二號同步方法");
        this.fun3();//呼叫三號同步方法
    }
    //同步方法3
    public synchronized void fun3(){
        System.out.println("我是三號同步方法");
    }
}

複製程式碼

 

 執行緒類,在run方法中呼叫一號同步方法:

複製程式碼

public class SynThreadText extends Thread {
    private Synfun_UseSynfun synfun_useSynfun;//組合上面類
    public SynThreadText(Synfun_UseSynfun synfun_useSynfun){
        this.synfun_useSynfun=synfun_useSynfun;//初始化上面的類
    }
    @Override
    public void run(){
        synfun_useSynfun.fun1();//呼叫物件類的同步方法
    }

    public static void main(String[] args) {
        Synfun_UseSynfun synfun_useSynfun =new Synfun_UseSynfun();
        SynThreadText synThreadText=new SynThreadText(synfun_useSynfun);
        synThreadText.start();//開啟執行緒
    }
}

複製程式碼

結果如下:

總結:可以看出一個執行緒呼叫了一個物件的同步方法,那麼他也可以呼叫這個物件的另外一個同步方法。

二.synchronized鎖重入支援父類繼承

 那麼既然synchronized支援物件的方法重入,那麼他是否也支援子類繼承父類的同步方法重入呢?

 不妨這樣設計程式碼,在父類中有一個同步方法,子類繼承這個方法,並且在建立一個子類的同步方法,在這個同步方法中去呼叫父類的同步方法。

程式碼如下:

複製程式碼

public class SubClass extends SuperClass implements Runnable {
    @Override
    public void run(){
        this.subSynFun();
    }
    //子類的同步方法
    public synchronized  void subSynFun(){
        System.out.println("子類的同步方法");
        this.superSynFun();
    }

    public static void main(String[] args) {
        SubClass sub=new SubClass();
        Thread t =new Thread(sub);
        t.start();
    }

}
//父類
class SuperClass{
    //父類的同步方法
    public synchronized void superSynFun(){
        System.out.println("父類的同步方法");
    }
}

複製程式碼

結果如下:

說明synchronized的方法是可以重入自己的父類同步化方法。

但是在這裡要注意一點的:當你去重寫父類中的同步方法,如果想要達到同步的效果重寫方法也必須是同步化的,反面教材程式碼如下:

複製程式碼

public class SubClass2  extends SuperClass2 implements Runnable{
    @Override
    public void run(){
        
    }
    //重寫後的方法不為同步的
    @Override
    public void superSynfun(){
        System.out.println("子類中重寫了父類中的同步方法,改為非同步");
    }
}
//父類
class SuperClass2{
    //父類的同步方法
    public synchronized void superSynfun(){
        System.out.println("父類的同步方法");
    }
}

複製程式碼

 

 重寫的方法也必須是同步化的才能實現同步。

來源:https://www.cnblogs.com/SAM-CJM/p/9802956.html

 

鄭州女性不孕不育醫院

鄭州不孕不育醫院

鄭州哪個醫院治不孕不育好

鄭州不孕不育