Вот несколько вопросов, которые я недавно задавал респондентам, которые говорят, что знают параллелизм Java:
- Объясните опасность «видимости памяти» - способ, которым JVM может переупорядочить определенные операции с переменными, которые не защищены монитором и не объявлены
volatile
, так что один поток может не увидеть изменения, сделанные другим потоком. Обычно я спрашиваю об этом, показывая код, в котором присутствует эта опасность (например,NoVisibility
пример в листинге 3.1 из «Параллелизма Java на практике» Гетца и др.) И спрашиваю, что не так. - Объясните, как это
volatile
влияет не только на фактическую объявленную переменнуюvolatile
, но также на любые изменения переменных, сделанные потоком, прежде чем он изменитvolatile
переменную. - Почему вы можете использовать
volatile
вместоsynchronized
? - Реализуйте условную переменную с помощью
wait()
иnotifyAll()
. Объясните, почему вы должны использоватьnotifyAll()
. Объясните, почему переменную условия следует проверять с помощьюwhile
цикла.
Мой вопрос - уместны ли они или слишком продвинуты, чтобы спросить кого-то, кто говорит, что знает параллелизм Java?
И в то время как мы занимаемся этим, думаете ли вы, что кто-то, работающий в параллелизме Java, должен иметь более высокий уровень знаний о сборке мусора Java?
java
interview
concurrency
sparc_spread
источник
источник
notifyAll()
«Я не верю в работу планировщика ОС, поэтому я используюnotify()
»Ответы:
Это действительно зависит от того, спрашиваете ли вы кандидата с 2-летним опытом работы с Java или с 7-летним опытом работы с Java. Для архитектора / технического руководителя / старшего они кажутся правильными вопросами, но для младшего и, возможно, среднего уровня, они кажутся довольно сложными.
Также вы задаете вопрос о низкоуровневых механизмах синхронизации, которые были заменены в основном
java.util.concurrent
в Java-разработке на сегодняшний день; вместоwait()/notify()
замков предпочтительнее. Вы можете видеть, что в Effective Java 2nd edition пропущена глава, в которой подробно объясняется механизм ожидания / уведомления, поскольку он не считается полезным. Кроме того, контейнер обрабатывает многопоточность на более высоком уровне в большинстве случаев; методы EJB являются поточно-ориентированными, например, без какой-либо заботы программиста (это не означает, что программисты не должны знать многопоточность).Я действительно вижу, что многопоточность является частью операционных систем, а не частью языка программирования. Чтобы понять, действительно ли человек понимает многопоточность и параллельное программирование, вопросы, касающиеся мьютексов, семафоров или расписаний, следует задавать в первую очередь и только потом, подробности о реализации на конкретном языке программирования.
источник
lock
противwait/notify
- я знал об этомlock
из книги Гетца, но не понимал, что теперь она предпочтительнее старой. Я согласен с @Martijn, что кто-то с таким уровнем опыта должен знать о старых подходах. В любом случае, я не хочу снова задавать вопрос (особенно, поскольку я уже пометил его как ответ - вами :-)), но я думаю, что кто-то с 10-летним опытом должен быть в состоянии ответить на эти вопросы, нет?lock
противwait/notify
, блокировки предпочтительны, когда вам действительно нужны низкоуровневые функции, но в большинстве случаев доступна альтернатива более высокого уровня; BlockingQueue является особенно полезным.Я бы сказал, что это относительно сложные вопросы. Однако они не являются «несправедливыми» в том смысле, что они не являются каверзными вопросами.
Действительно, «справедливость» на самом деле не является уместным критерием. Вы (как интервьюер) должны беспокоиться о том, выбирают ли вопросы и ваша интерпретация ответов лучших кандидатов на ту должность или должности, на которые вы проводите собеседование. (Или, другими словами, вы отвергаете кандидатов, которые действительно должны уделять больше внимания из-за того, что они не отвечают на эти вопросы «правильно»?)
Опять же, это не совсем актуальный вопрос. Вопрос, который вы должны задать себе: нужен ли вам кто-то, кто хорошо знает сборку мусора Java.
источник