看以下示例:
父类A:
子类B:(未重写test方法)
子类C:(重写test方法,但是并未加上synchronized)
public class synchronized的继承问题 {
public static void main(String[] args) throws InterruptedException {
A a = new A();
Thread A1 = new Thread(() -> {
try {
a.test();
} catch (Exception e) {
e.printStackTrace();
}
}, "A1");
Thread A2 = new Thread(() -> {
try {
a.test();
} catch (Exception e) {
e.printStackTrace();
}
}, "A2");
A1.start();
A2.start();
A1.join();
A2.join();
System.out.println("=============");
B b = new B();
Thread B1 = new Thread(() -> {
try {
b.test();
} catch (Exception e) {
e.printStackTrace();
}
}, "B1");
Thread B2 = new Thread(() -> {
try {
b.test();
} catch (Exception e) {
e.printStackTrace();
}
}, "B2");
B1.start();
B2.start();
B1.join();
B2.join();
System.out.println("=============");
C c = new C();
Thread C1 = new Thread(() -> {
try {
c.test();
} catch (Exception e) {
e.printStackTrace();
}
}, "C1");
Thread C2 = new Thread(() -> {
try {
c.test();
} catch (Exception e) {
e.printStackTrace();
}
}, "C2");
C1.start();
C2.start();
C1.join();
C2.join();
}
}
class A {
synchronized void test() throws Exception {
try {
System.out.println("main 下一步 sleep begin threadName=" + Thread.currentThread().getName() + " time=" + System.currentTimeMillis());
Thread.sleep(2000);
System.out.println("main 下一步 sleep end threadName=" + Thread.currentThread().getName() + " time=" + System.currentTimeMillis());
} catch (Exception e) {
e.printStackTrace();
}
}
}
class B extends A {
}
class C extends A {
@Override
void test() throws Exception {
try {
System.out.println("main 下一步 sleep begin threadName=" + Thread.currentThread().getName() + " time=" + System.currentTimeMillis());
Thread.sleep(2000);
System.out.println("main 下一步 sleep end threadName=" + Thread.currentThread().getName() + " time=" + System.currentTimeMillis());
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果如下:
结论:
synchronized不能继承这句话有歧义,如果子类直接集成父类的synchronized方法是可以继承的,但是如果子类想要重写父类的同步方法,synchronized关键字一定要显示写出,否则无效。
参考:https://blog.csdn.net/qq_33774822/article/details/104775075