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