Страницы

Поиск по вопросам

среда, 12 июня 2019 г.

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

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

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


Ответ

Тут три варианта: либо вопрос поставлен некорректно, либо ответы сформулированы не совсем ясно (особенно третий, который можно трактовать в сторону правильного), либо в тесте ошибка и правильного варианта ответа нет.
Если один поток начал исполнение 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

Комментариев нет:

Отправить комментарий