什么是可重入:指的是同一線程的外層函數(shù)獲得鎖之后鞭缭,內(nèi)層函數(shù)可以直接再次獲得該鎖。
(搖號(hào)-一次搖號(hào)只給一輛車(chē)上牌照 梢为,還需上就要重新?lián)u號(hào)(不可重入))
好處:避免死鎖莺奸,提升封裝性萨咕。
粒度:線程而非調(diào)用
情況1:證明一個(gè)方法是可重入的
/**
* @author sxylml
* @Date : 2019/2/26 13:52
* @Description:
* 可重入粒度測(cè)試看统抬,遞歸調(diào)用本方法
*/
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:證明可重入不要求是同一個(gè)方法
/**
* @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:證明可重入不要求是同一個(gè)類種的
/**
* @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();
}
}
粒度是線程,而不是調(diào)用危队,具備可重入性聪建。
不可中斷性