Oto kilka pytań, które ostatnio zadałem rozmówcom, którzy twierdzą, że znają współbieżność Java:
- Wyjaśnij zagrożenie związane z „widocznością pamięci” - sposobem, w jaki JVM może zmieniać kolejność niektórych operacji na zmiennych, które nie są chronione przez monitor i nie są deklarowane
volatile
, tak że jeden wątek może nie widzieć zmian wprowadzonych przez inny wątek. Zwykle pytam o to, pokazując kod, w którym występuje to zagrożenie (np.NoVisibility
Przykład z listingu 3.1 z „Java Concurrency in Practice” Goetza i in.) I pytając, co jest nie tak. - Wyjaśnij, w jaki sposób
volatile
wpływa nie tylko na zadeklarowaną zmienną rzeczywistąvolatile
, ale także na wszelkie zmiany w zmiennych dokonane przez wątek przed zmianąvolatile
zmiennej. - Dlaczego możesz użyć
volatile
zamiastsynchronized
? - Zaimplementuj zmienną warunkową za pomocą
wait()
inotifyAll()
. Wyjaśnij, dlaczego powinieneś używaćnotifyAll()
. Wyjaśnij, dlaczego zmienną warunkową należy testować za pomocąwhile
pętli.
Moje pytanie brzmi - czy są one odpowiednie lub zbyt zaawansowane, aby zapytać kogoś, kto twierdzi, że zna współbieżność Java?
A skoro już nad tym pracujemy, czy uważasz, że ktoś, kto pracuje we współbieżności Java, powinien mieć ponadprzeciętną wiedzę na temat usuwania śmieci Java?
notifyAll()
„Nie wierzę w pracę z harmonogramem systemu operacyjnego, więc używam notify()
”