什么是可重入:指的是同一线程的外层函数获得锁之后,内层函数可以直接再次获得该锁。
(摇号-一次摇号只给一辆车上牌照 ,还需上就要重新摇号(不可重入))
好处:避免死锁,提升封装性。
粒度:线程而非调用
情况1:证明一个方法是可重入的
/**
* @author sxylml
* @Date : 2019/2/26 13:52
* @Description:
* 可重入粒度测试看,递归调用本方法
*/
public class SynchronizedRecursion {
int a = 0;
public static void main(String[] args) {
SynchronizedRecursion synchronizedRecursion = new SynchronizedRecursion();
synchronizedRecursion.method1();
}
private void method1() {
System.out.println("这是method1() ,a=" + a);
if (a == 0) {
a++;
method1();
}
}
}
情况2:证明可重入不要求是同一个方法
/**
* @author sxylml
* @Date : 2019/2/26 14:01
* @Description:
*/
public class SynchronizedOtherMethod {
public synchronized void method1(){
System.out.println("method1");
method2();
}
public synchronized void method2(){
System.out.println("method2");
}
public static void main(String[] args) {
SynchronizedOtherMethod synchronizedOtherMethod = new SynchronizedOtherMethod();
synchronizedOtherMethod.method1();
}
}
情况3:证明可重入不要求是同一个类种的
/**
* @author sxylml
* @Date : 2019/2/26 14:07
* @Description:
*/
public class SynchronizedSuper {
public synchronized void doSometing() {
System.out.println("我是父类的方法");
}
}
class SubClass extends SynchronizedSuper {
@Override
public synchronized void doSometing() {
System.out.println("我是子类方法");
super.doSometing();
}
public static void main(String[] args) {
SubClass s = new SubClass();
s.doSometing();
}
}
粒度是线程,而不是调用,具备可重入性。
不可中断性
网友评论