關(guān)鍵字synchronized擁有鎖重入的功能,也就是在使用synchronized時,當(dāng)一個線程得到一個對象鎖后,再次請求此對象鎖時是可以再次得到該對象鎖的。這也證明在一個synchronized方法/塊的內(nèi)部調(diào)用本類的其他synchronized方法/塊時,是永遠(yuǎn)可以得到鎖的。
/**
* @author wuyoushan
* @date 2017/4/10.
*/
public class Service {
synchronized public void service1(){
System.out.println("service1");
service2();
}
synchronized public void service2() {
System.out.println("service2");
service3();
}
synchronized public void service3() {
System.out.println("service3");
}
}
/**
* MyThread線程測試
* @author wuyoushan
* @date 2017/3/21.
*/
public class MyThread extends Thread {
@Override
public void run() {
Service service=new Service();
service.service1();
}
}
/**
* @author wuyoushan
* @date 2017/3/20.
*/
public class Run {
public static void main(String[] args){
MyThread thread=new MyThread();
thread.start();
}
}
程序的運(yùn)行結(jié)果:
service1
service2
service3
“可重入鎖”的概念是:自己可以再次獲取自己的內(nèi)部鎖。
比如有1條線程獲得了某個對象的鎖,此時這個對象鎖還沒有釋放,當(dāng)其再次想要獲取這個對象的鎖的時候還是可以獲取的,如果不可鎖重入的話,就會造成死鎖。
可重入鎖也支持在父子類繼承的環(huán)境中
/**
* @author wuyoushan
* @date 2017/4/11.
*/
public class Main {
public int i=10;
synchronized public void operateMainMethod(){
try {
i--;
System.out.println("main print i=" + i);
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
/**
* @author wuyoushan
* @date 2017/4/11.
*/
public class Sub extends Main {
synchronized public void operateISubMethod(){
try{
while (i>0) {
i--;
System.out.println("sub print i="+i);
Thread.sleep(100);
this.operateMainMethod();
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
/**
* MyThread線程測試
* @author wuyoushan
* @date 2017/3/21.
*/
public class MyThread extends Thread {
@Override
public void run() {
Sub sub=new Sub();
sub.operateISubMethod();
}
}
/**
* @author wuyoushan
* @date 2017/3/20.
*/
public class Run {
public static void main(String[] args){
MyThread thread=new MyThread();
thread.start();
}
}
程序運(yùn)行結(jié)果為:
sub print i=9
main print i=8
sub print i=7
main print i=6
sub print i=5
main print i=4
sub print i=3
main print i=2
sub print i=1
main print i=0
此程序說明,當(dāng)存在父類繼承關(guān)系時,子類是完全可以通過“可重入鎖”調(diào)用父類的同步方法的。
摘選自 java多線程核心編程技術(shù)-2.1.6