Сдавал финальный экзамен на 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
Комментариев нет:
Отправить комментарий