同步synchronized不具有继承性,下面通过Java的代码来体现(代码参考自书本《Java多线程编程核心技术》):
package service;
public class Main {
synchronized public void serviceMethod() {
try {
System.out.println("int main 下一步 sleep begin threadName="
+ Thread.currentThread().getName() + " time="
+ System.currentTimeMillis());
Thread.sleep(5000);
System.out.println("int main 下一步 sleep end threadName="
+ Thread.currentThread().getName() + " time="
+ System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package service;
public class Sub extends Main {
@Override
public void serviceMethod() {
try {
System.out.println("int sub 下一步 sleep begin threadName="
+ Thread.currentThread().getName() + " time="
+ System.currentTimeMillis());
Thread.sleep(5000);
System.out.println("int sub 下一步 sleep end threadName="
+ Thread.currentThread().getName() + " time="
+ System.currentTimeMillis());
super.serviceMethod();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package extthread;
import service.Sub;
public class MyThreadA extends Thread {
private Sub sub;
public MyThreadA(Sub sub) {
super();
this.sub = sub;
}
@Override
public void run() {
sub.serviceMethod();
}
}
package extthread;
import service.Sub;
public class MyThreadB extends Thread {
private Sub sub;
public MyThreadB(Sub sub) {
super();
this.sub = sub;
}
@Override
public void run() {
sub.serviceMethod();
}
}
package controller;
import extthread.MyThreadA;
import extthread.MyThreadB;
import service.Sub;
public class Test {
public static void main(String[] args) {
Sub subRef = new Sub();
MyThreadA a = new MyThreadA(subRef);
a.setName("A");
a.start();
MyThreadB b = new MyThreadB(subRef);
b.setName("B");
b.start();
}
}
运行后的结果如下图:
运行步骤:
第一步、线程A调用Sub中serviceMethod()方法打印第一行“int sub 下一步 sleep begin threadName=A time=1540907150314”,然后延时等待5000ms;
第二步、线程B调用Sub中serviceMethod()方法打印第二行“int sub 下一步 sleep begin threadName=B time=1540907150314”,然后延时等待5000ms;
第三步、线程A继续Sub中serviceMethod()方法打印第三行“int sub 下一步 sleep end threadName=A time=1540907155315”;
第四步、线程B继续Sub中serviceMethod()方法打印第四行“int sub 下一步 sleep end threadName=B time=1540907155315”;
第五步、线程A继续Sub中serviceMethod()方法调用父类Main中的serviceMethod()方法打印第五行“int main 下一步 sleep begin threadName=A time=1540907155315”;
第六步、线程A继续Main中serviceMethod()方法打印第六行“int main 下一步 sleep end threadName=A time=1540907160316”;
第七步、线程B继续Sub中serviceMethod()方法调用父类Main中的serviceMethod()方法打印第七行“int main 下一步 sleep begin threadName=B time=1540907160316”;
第八步、线程B继续Main中serviceMethod()方法打印第八行“int main 下一步 sleep end threadName=B time=1540907165316”;
结论:从运行结果可以看出,第一行到第四行是子类Sub中serviceMethod()方法的非同步调用,第五行到第八行是父类Main中serviceMethod()方法的同步调用。可以证实线程同步不具有继承性。要实现同步,子类Sub中serviceMethod()必须加上synchronized。
内容有点粗糙,望大家见谅!有什么问题,欢迎和我讨论!