1? synchronized可重入性的理解
當一個線程試圖操作一個由其他線程持有的對象鎖的臨界資源時,將會處于阻塞狀態,但當一個線程再次請求自己持有對象鎖的臨界資源時,如果當前鎖是重入性,會請求將會成功,如果當前鎖不是可重入性,會等待當前對象鎖的釋放,實際上該對象鎖已被當前線程所持有,不可能再次獲得,就會產生死鎖,在java中synchronized是基于原子性的內部鎖機制,是可重入的,因此在一個線程調用synchronized方法的同時在其方法體內部調用該對象另一個synchronized方法,也就是說一個線程得到一個對象鎖后再次請求該對象鎖,是允許的,還有就是當子類繼承父類時,子類也是可以通過可重入鎖調用父類的同步方法,這就是synchronized的可重入性。
?
?
?
?
?
?
?
?
?
2? 測試synchronized方法調用synchronized方法
1)代碼
import java.io.*;class Parent {public synchronized void willDo() {System.out.println("我是父類的方法");}
}class Child extends Parent {@Overridepublic synchronized void willDo() {super.willDo();System.out.println("我是子類方法");}public static void main(String[] args) {Child child = new Child();child.willDo();}
}
?
?
2)運行結果
我是父類的方法
我是子類方法
?
?
?
?
?
?
?
?
3?測試子類synchronized方法調用父類synchronized方法
1)代碼
class Test implements Runnable {static Test instance = new Test();static int i=0;static int j=0;@Overridepublic void run() {for(int j = 0; j < 10; j++) {//當前實例對象鎖synchronized(this){i++;willDo();}}}public synchronized void willDo() {j++;}public static void main (String[] args) throws java.lang.Exception {Thread t1 = new Thread(instance);t1.start();t1.join();System.out.println(i);}
}
?
2)運行結果
10
?