Подтвердить что ты не робот

Синхронизировано ли унаследовано в Java?

У меня есть метод superclass Point и synchronized draw(). Будут ли подклассы Point наследовать synchronized, если я переопределяю метод draw() в них или я должен всегда писать его?

4b9b3361

Ответ 1

Нет, вам всегда придется писать synchronized. Если вы вызовете синхронизированный метод суперкласса, это, конечно же, будет синхронизированный вызов. synchronized не является частью сигнатуры метода.

Подробнее см. http://gee.cs.oswego.edu/dl/cpj/mechanics.html от Doug Lea, Java threading boss (или так).

Ответ 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.

Ответ 3

ваш метод Override будет больше не синхронизироваться, если вы переопределите его и удалите synchronized. Найденный здесь здесь и здесь