在前文中提到,锁重入是支持继承的,但是同步其实不可以继承的
父类的方法是同步的:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
public class MyObject {
public synchronized void methodA() { System.out.println("begin methodA threadName=" + Thread.currentThread().getName()); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("end methodA threadName=" + Thread.currentThread().getName()); }
}
|
但是子类重写方法时去掉了 synchronized 关键字:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
public class MyObjectSon extends MyObject{
@Override public void methodA() { System.out.println("begin methodA threadName=" + Thread.currentThread().getName()); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("end methodA threadName=" + Thread.currentThread().getName()); }
}
|
线程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
public class ThreadA extends Thread {
private MyObject myObject;
public ThreadA(MyObject myObject) { super(); this.myObject = myObject; }
@Override public void run() { super.run(); myObject.methodA(); } }
public class ThreadB extends Thread {
private MyObject myObject;
public ThreadB(MyObject myObject) { super(); this.myObject = myObject; }
@Override public void run() { super.run(); myObject.methodA(); } }
|
ThreadRunner:
1 2 3 4 5 6 7 8 9 10 11 12
|
public class ThreadRunner {
public static void main(String[] args) { MyObjectSon myObjectSon = new MyObjectSon(); ThreadA threadA = new ThreadA(myObjectSon); threadA.setName("A"); ThreadB threadB = new ThreadB(myObjectSon); threadB.setName("B"); threadA.start(); threadB.start(); } }
|
控制台:
1 2 3 4
|
begin methodA threadName=A begin methodA threadName=B end methodA threadName=A end methodA threadName=B
|
子类的方法经过重写,已经不具备同步了
近期评论