一.关键字synchronized拥有锁重入的功能,也就是在使用synchronized时,当一个线程得到一个锁对象后,再次请求此对象锁时是可以再次得到该对象的锁的。这样就说明在一个synchronized方法/块的内部调用本类的其他synchronized方法/块,是可以永远得到锁的。
二.可重入锁案例
1)情况一:对象内部自己再次获取自己内部锁
package org.zhq.test;
/**
* @author 作者 hq.zheng:
* @version 创建时间:2018-6-13 下午1:52:21
* 类说明
*/
public class Service {
synchronized public void ser1(){
System.out.println("ser1");
ser2();
}
synchronized public void ser2(){
System.out.println("ser2");
ser3();
}
synchronized public void ser3(){
System.out.println("ser3");
}
}
package org.zhq.test;
/**
* @author 作者 hq.zheng:
* @version 创建时间:2018-6-11 下午3:00:57
* 类说明
*/
public class MyThread extends Thread {
private int i=0;
@Override
synchronized public void run() {
Service ser=new Service();
ser.ser1();
}
}
package org.zhq.test;
/**
* @author 作者 hq.zheng:
* @version 创建时间:2018-6-11 下午3:02:47
* 类说明
*/
public class Run {
public static void main(String[] args) {
MyThread t=new MyThread();
t.start();
}
}
结果:
2)情况二:父子继承的环境中
package org.zhq.test;
/**
* @author 作者 hq.zheng:
* @version 创建时间:2018-6-13 下午2:09:57
* 类说明
*/
public class Father {
public int i=10;
synchronized public void fatherMethod(){
try {
i--;
System.out.println("father print i="+i);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package org.zhq.test;
/**
* @author 作者 hq.zheng:
* @version 创建时间:2018-6-13 下午2:24:43
* 类说明
*/
public class Child extends Father {
synchronized public void childMethod() {
try {
while(i>0){
i--;
System.out.println("child print i="+i);
Thread.sleep(100);
this.fatherMethod();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package org.zhq.test;
/**
* @author 作者 hq.zheng:
* @version 创建时间:2018-6-11 下午3:00:57
* 类说明
*/
public class MyThread extends Thread {
private int i=0;
@Override
synchronized public void run() {
Child c=new Child();
c.childMethod();
}
}
package org.zhq.test;
/**
* @author 作者 hq.zheng:
* @version 创建时间:2018-6-11 下午3:02:47
* 类说明
*/
public class Run {
public static void main(String[] args) {
MyThread t=new MyThread();
t.start();
}
}
结果: