thread 同步不可继承

在前文中提到,锁重入是支持继承的,但是同步其实不可以继承的

父类的方法是同步的:

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

子类的方法经过重写,已经不具备同步了