Вопрос про доступность полей и методов объекта synchronized блока

254
20 мая 2017, 17:41

Сдавал финальный экзамен на intuit.ru. Курс по java, на следующий вопрос про synchronized-блок получил, что ответ неверный. Никак не могу понять почему. Может кто подскажет, спасибо.

В самом курсе черным по белому написано, что и к полям, и к методам объекта, на который вешается lock, можно без проблем обращаться другим потокам. (Ну, видимо, кроме synchronized методов, ибо они пытаются повесить lock на объект, из которого вызываются, а он уже залочен по условиям задачи. Но сути это не меняет, к полям тоже можно обращаться, т.е. вариант 4 не подходит...)

Может что с 2003 года поменялось... (курс старый)

Answer 1

Тут три варианта: либо вопрос поставлен некорректно, либо ответы сформулированы не совсем ясно (особенно третий, который можно трактовать в сторону правильного), либо в тесте ошибка и правильного варианта ответа нет.

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

Синхронизация по объекту накладывает ограничение на другие блоки синхронизации по этому же объекту и на вызов синхронизированных методов. На доступ к полям и не синхронизированным методам synchronized-блок не влияет.

И пример:

public class Foo {
    public int mValue = 5;
    public String bar() {
        return "bar";
    }
}
public class Main {
    private static Foo sFoo;
    public static void main(String[] args) {
        sFoo = new Foo();
        new Thread(() -> f()).start();
        new Thread(() -> {
            System.out.println("Second thread: start");
            System.out.println("Member: " + sFoo.mValue);
            System.out.println("Method: " + sFoo.bar());
            System.out.println("Second thread: end");
        }).start();

    }
    private static void f() {
        synchronized (sFoo) {
            try {
                System.out.println("First thread: start");
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("First thread: end");
        }
    }
}

Вывод на консоль:

First thread: start
Second thread: start
Member: 5
Method: bar
Second thread: end
First thread: end
READ ALSO
Программное закрытие приложения Android

Программное закрытие приложения Android

Код выставлять не буду, ибо толку от этого ноль в моем случаеВсе очень просто

348
Как проходит оплата на upWork?

Как проходит оплата на upWork?

Добрый деньВчера получил первый заказ на UpWork

549
Как получить token для уведомлений?

Как получить token для уведомлений?

Как получить токен в android приложении программно для получения уведомлений?

237
Почему const и goto не используются в java?

Почему const и goto не используются в java?

Давайте поговорим о двух зарезервированных, но неиспользуемых ключевых словах языка Java — const и gotoПочему они не используются? Как я понял...

314