Ось кілька запитань, які я нещодавно задавав респондентам, які кажуть, що знають паралельність Java:
- Поясніть небезпеку «видимості пам’яті» - спосіб JVM може переупорядкувати певні операції над змінними, незахищеними монітором і не оголошеними
volatile
, таким чином, щоб один потік не бачив зміни, внесені іншим потоком. Зазвичай я запитую це, показуючи код, де існує ця небезпека (наприклад,NoVisibility
приклад у Лістингу 3.1 з «Конкурсу Java на практиці» Goetz та ін.) І запитую, що не так. - Поясніть, як
volatile
впливає не тільки фактична заявлена зміннаvolatile
, але й будь-які зміни змінних, внесених потоком, перш ніж вона змінюєvolatile
змінну. - Чому ви можете використовувати
volatile
замість цьогоsynchronized
? - Реалізуйте змінну умови за допомогою
wait()
таnotifyAll()
. Поясніть, для чого слід використовуватиnotifyAll()
. Поясніть, чому змінну стану слід перевірити за допомогоюwhile
циклу.
Моє запитання - це відповідні чи занадто просунуті питання, щоб запитати когось, хто каже, що знає Java одночасність?
І хоча ми до цього звертаємось, чи вважаєте ви, що від того, хто працює у спільній валюті на Java, слід очікувати, що той, хто має надмірні знання про збирання сміття на Java?
notifyAll()
"Я не вірю в виконання роботи планувальника ОС, тому я використовую notify()
"