深入理解Java中的synchronized鎖重入
阿新 • • 發佈:2018-11-10
問題匯入:如果一個執行緒呼叫了一個物件的同步方法,那麼他還能不能在呼叫這個物件的另外一個同步方法呢?
這裡就是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