Java之synchronized可重入性的理解
1 synchronized可重入性的理解
當(dāng)一個(gè)線程試圖操作一個(gè)由其他線程持有的對(duì)象鎖的臨界資源時(shí),將會(huì)處于阻塞狀態(tài),但當(dāng)一個(gè)線程再次請(qǐng)求自己持有對(duì)象鎖的臨界資源時(shí),如果當(dāng)前鎖是重入性,會(huì)請(qǐng)求將會(huì)成功,如果當(dāng)前鎖不是可重入性,會(huì)等待當(dāng)前對(duì)象鎖的釋放,實(shí)際上該對(duì)象鎖已被當(dāng)前線程所持有,不可能再次獲得,就會(huì)產(chǎn)生死鎖,在java中synchronized是基于原子性的內(nèi)部鎖機(jī)制,是可重入的,因此在一個(gè)線程調(diào)用synchronized方法的同時(shí)在其方法體內(nèi)部調(diào)用該對(duì)象另一個(gè)synchronized方法,也就是說一個(gè)線程得到一個(gè)對(duì)象鎖后再次請(qǐng)求該對(duì)象鎖,是允許的,還有就是當(dāng)子類繼承父類時(shí),子類也是可以通過可重入鎖調(diào)用父類的同步方法,這就是synchronized的可重入性。
2 測(cè)試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)運(yùn)行結(jié)果
我是父類的方法
我是子類方法
3 測(cè)試子類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)前實(shí)例對(duì)象鎖
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)運(yùn)行結(jié)果
10
作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)