线程同步不具有继承性

同步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。

 

内容有点粗糙,望大家见谅!有什么问题,欢迎和我讨论!

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值