Java之synchronized可重入性的理解
1 synchronized可重入性的理解
當(dāng)一個線程試圖操作一個由其他線程持有的對象鎖的臨界資源時,將會處于阻塞狀態(tài),但當(dāng)一個線程再次請求自己持有對象鎖的臨界資源時,如果當(dāng)前鎖是重入性,會請求將會成功,如果當(dāng)前鎖不是可重入性,會等待當(dāng)前對象鎖的釋放,實際上該對象鎖已被當(dāng)前線程所持有,不可能再次獲得,就會產(chǎn)生死鎖,在java中synchronized是基于原子性的內(nèi)部鎖機制,是可重入的,因此在一個線程調(diào)用synchronized方法的同時在其方法體內(nèi)部調(diào)用該對象另一個synchronized方法,也就是說一個線程得到一個對象鎖后再次請求該對象鎖,是允許的,還有就是當(dāng)子類繼承父類時,子類也是可以通過可重入鎖調(diào)用父類的同步方法,這就是synchronized的可重入性。
2 測試synchronized方法調(diào)用synchronized方法
1)代碼
import java.io.*;
class Parent {
public synchronized void willDo() {
System.out.println("我是父類的方法");
}
}
class Child extends Parent {
@Override
public synchronized void willDo() {
super.willDo();
System.out.println("我是子類方法");
}
public static void main(String[] args) {
Child child = new Child();
child.willDo();
}
}
2)運行結(jié)果
我是父類的方法
我是子類方法
3 測試子類synchronized方法調(diào)用父類synchronized方法
1)代碼
class Test implements Runnable {
static Test instance = new Test();
static int i=0;
static int j=0;
@Override
public void run() {
for(int j = 0; j < 10; j++) {
//當(dāng)前實例對象鎖
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)運行結(jié)果
10
作者:chen.yu
深信服三年半工作經(jīng)驗,目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進階人工智能(鏈接)