我有超类Point
和synchronized
方法draw()
。如果我覆盖其中的方法或者我必须始终编写它,它们的子类会Point
继承吗?synchronized
draw()
问问题
8293 次
3 回答
31
不,你总是要写synchronized
。如果你调用超类的同步方法,这当然是一个同步调用。synchronized
不是方法签名的一部分。
请参阅http://gee.cs.oswego.edu/dl/cpj/mechanics.html以了解来自 Java 线程老板(左右)的 Doug Lea 的详细描述。
于 2013-04-14T11:14:17.170 回答
8
您可以通过编写以下代码自行检查:
public class Shape {
protected int sum = 0;
public synchronized void add(int x) {
sum += x;
}
}
public class Point extends Shape{
public void add(int x) {
sum += x;
}
public int getSum() {
return sum;
}
}
和测试班
public class TestShapes {
public final static int ITERATIONS = 100000;
public static void main(String[] args) throws InterruptedException {
final Point p = new Point();
Thread t1 = new Thread(){
@Override
public void run() {
for(int i=0; i< ITERATIONS; i++){
p.add(1);
}
}
};
Thread t2 = new Thread(){
@Override
public void run() {
for(int i=0; i< ITERATIONS; i++){
p.add(1);
}
}
};
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(p.getSum()); // should equal 200000
}
}
在我的机器上是 137099 而不是 200000。
于 2013-04-14T11:20:28.857 回答