synchronized的可重入性
如果一个同步方法m1中调用了另一个同步方法m2,并且这两个方法加的是同一把锁。那么在一个线程调用m1时就得到了这把锁,m1中调m2时发现是同一个线程,m2也能得到这把锁。这是锁的可重入。
所谓可重入锁就是拿到这把锁之后可以再加多道锁,但锁定的还是同一对象,被嵌套调用的同步方法执行完就去一道。
public class SyncTest_03 {
public synchronized void m1() {
System.out.println("m1 start");
m2(); // m2的第二道锁被释放后才继续往下执行
System.out.println("m1 end");
}
public synchronized void m2() {
System.out.println("m2");
}
public static void main(String[] args) {
SyncTest_03 syncTest03 = new SyncTest_03();
new Thread(syncTest03::m1).start();
}
}
- 模拟子类同步方法调用父类同步方法:
注:子类和父类是同一把锁
public class SyncTest_04 {
public synchronized void m() {
System.out.println("m start");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printSt