Вот несколько вопросов, которые я недавно задавал респондентам, которые говорят, что знают параллелизм Java:
- Объясните опасность «видимости памяти» - способ, которым JVM может переупорядочить определенные операции с переменными, которые не защищены монитором и не объявлены
volatile
, так что один поток может не увидеть изменения, сделанные другим потоком. Обычно я спрашиваю об этом, показывая код, в котором присутствует эта опасность (например,NoVisibility
пример в листинге 3.1 из «Параллелизма Java на практике» Гетца и др.) И спрашиваю, что не так. - Объясните, как это
volatile
влияет не только на фактическую объявленную переменнуюvolatile
, но также на любые изменения переменных, сделанные потоком, прежде чем он изменитvolatile
переменную. - Почему вы можете использовать
volatile
вместоsynchronized
? - Реализуйте условную переменную с помощью
wait()
иnotifyAll()
. Объясните, почему вы должны использоватьnotifyAll()
. Объясните, почему переменную условия следует проверять с помощьюwhile
цикла.
Мой вопрос - уместны ли они или слишком продвинуты, чтобы спросить кого-то, кто говорит, что знает параллелизм Java?
И в то время как мы занимаемся этим, думаете ли вы, что кто-то, работающий в параллелизме Java, должен иметь более высокий уровень знаний о сборке мусора Java?
notifyAll()
«Я не верю в работу планировщика ОС, поэтому я использую notify()
»