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?
java
interview
concurrency
sparc_spread
źródło
źródło
notifyAll()
„Nie wierzę w pracę z harmonogramem systemu operacyjnego, więc używamnotify()
”Odpowiedzi:
To naprawdę zależy od tego, czy pytasz kandydata z 2-letnim doświadczeniem w Javie czy z 7-letnim doświadczeniem w Javie. Dla architekta / kierownika technicznego / seniora wydają się właściwe pytania, ale dla młodszego i być może również na średnim poziomie wydają się trudne.
Zadajesz również pytanie o mechanizmy synchronizacji niskiego poziomu, które zostały zastąpione głównie przez
java.util.concurrent
programowanie w Javie; zamiastwait()/notify()
zamków są preferowane. Widać, że Effective Java 2. wydanie upuściło rozdział wyjaśniający szczegółowo mechanizm oczekiwania / powiadamiania, ponieważ nie został uznany za przydatny. Ponadto w większości przypadków kontener obsługuje wielowątkowość na wyższym poziomie; metody EJB są bezpieczne dla wątków, na przykład bez żadnych obaw ze strony programisty (nie oznacza to, że programiści nie powinni znać wielowątkowości).Widzę, że wielowątkowość jest raczej częścią systemu operacyjnego niż częścią języka programowania. Aby sprawdzić, czy dana osoba naprawdę rozumie wielowątkowość i programowanie równoległe, pytania dotyczące muteksów, semaforów lub harmonogramu należy zadawać najpierw, a dopiero potem ostatecznie, szczegóły dotyczące implementacji w określonym języku programowania.
źródło
lock
vs.wait/notify
- Wiedziałem o tymlock
z książki Goetza, ale nie zdawałem sobie sprawy, że teraz jest preferowane w stosunku do starej. Zgadzam się z @Martijn, jednak osoba o takim poziomie doświadczenia powinna być świadoma starszych metod. W każdym razie nie zamierzam zadawać pytania ponownie (zwłaszcza, że już zaznaczyłem je jako udzielone - przez ciebie :-)), ale uważam, że ktoś z 10-letnim doświadczeniem powinien być w stanie odpowiedzieć na te pytania, nie?lock
vswait/notify
, blokady są preferowane, gdy naprawdę potrzebujesz funkcji niskiego poziomu, ale w większości przypadków dostępna jest alternatywa wyższego poziomu; BlockingQueue jest szczególnie przydatny.Powiedziałbym, że są to stosunkowo zaawansowane pytania. Nie są one jednak „niesprawiedliwe” w tym sensie, że nie są podstępnymi pytaniami.
Rzeczywiście „uczciwość” nie jest tak naprawdę istotnym kryterium. To, o czym (jako ankieter) powinieneś się martwić, to, czy pytania i twoja interpretacja odpowiedzi dotyczy wyboru najlepszych kandydatów na stanowisko lub stanowiska, z którymi rozmawiasz. (Innymi słowy, czy odrzucasz kandydatów, których naprawdę powinieneś poświęcić więcej uwagi, ponieważ nie odpowiedzieli na te pytania „poprawnie”?)
Ponownie, to nie jest właściwe pytanie. Pytanie, które powinieneś sobie zadać, brzmi: czy potrzebujesz kogoś, kto ma dobrą wiedzę na temat usuwania śmieci w Javie.
źródło