Задача: реализовать класс Ref<A>, который представляет собой изменяемую ссылку. У класса должно быть два метода: set и get. set - устанавливает значение ссылки, get - получает значение ссылки или блокируется до тех пор, пока там не появится ненулевое значение.
Решений можно придумать много. На ум приходят synchronized/notify, AtomicReference, блокирующие очереди, примитивы вроде CountDownLatch и т.д. Приведу решение с synchronized/notify как самое натуральное, по моему мнению:
public class Ref<A> {
private A a;
public Ref() {
}
public synchronized A get() throws InterruptedException {
while (a == null) {
wait();
}
return a;
}
public synchronized void set(A a) {
this.a = a;
if (a != null) {
notifyAll();
}
}
}
Ничего сверхсложного, но есть пара нюансов, которые нужно понимать, в частности:
- Не забыть делать проверку a == null в цикле (правило).
- Нужно вызывать notifyAll, а не notify (правило).
Если кандидат успешно решает задачу, то можете быть на 90% уверенным, что программист хорош. Спросите у него ещё пару простых вопросов на алгоритмы и смело нанимайте.
Комментариев нет:
Отправить комментарий