同步在 Java 中是继承的吗?

2022-09-01 09:50:59

我有超类和方法。如果我在其中重写方法,继承的子类会不会,或者我必须总是写它?Pointsynchronizeddraw()Pointsynchronizeddraw()


答案 1

不,您将始终必须编写 .如果您调用超类的同步方法,这当然是一个同步调用。 不是方法签名的一部分。synchronizedsynchronized

有关 Java 线程主管 Doug Lea(左右)的详细说明,请参阅 http://gee.cs.oswego.edu/dl/cpj/mechanics.html


答案 2

你可以通过写这个来自己检查它:

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。


推荐