synchronized锁是可重入的。即线程T申请到了锁A,再次访问锁A的其他同步方法是可以直接调用执行的。
子类调用父类的同步方法,依旧可以重入。
代码示例
public class T {
synchronized void m1() {
System.out.println("m1 start");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
m2();
System.out.println("m1 end");
}
synchronized void m2() {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("m2");
}
public static void main(String[] args) {
new Thread(() -> new T().m1()).start();
}
}
输入结果:
m1 start
m2
m1 end
代码示例二-子类调用父类同步方法
public class T {
synchronized void m() {
System.out.println("m start");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("m end");
}
public static void main(String[] args) {
new TT().m();
}
}
class TT extends T {
@Override
synchronized void m() {
System.out.println("child m start");
super.m();
System.out.println("child m end");
}
}
输出结果:
child m start
m start
m end
child m end