32

我有超类Pointsynchronized方法draw()。如果我覆盖其中的方法或者我必须始终编写它,它们的子类会Point继承吗?synchronizeddraw()

4

3 回答 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 回答
5

如果您覆盖它并删除synchronized. 在这里这里找到它

于 2013-04-14T11:13:00.597 回答