2010-03-19 7 views
7

Java 6 API pytanie. Czy zadzwonienie pod numer LockSupport.unpark(thread) ma związek z powrotem z LockSupport.park w wątku just-unparked przed ? Podejrzewam, że odpowiedź brzmi "tak", ale Javadoc nie wspomina o tym wyraźnie.Java LockSupport Memory Consistency

Odpowiedz

1

Wyglądałem jak kod JDK i wygląda na to, że metody LockSupport są zwykle wywoływane poza blokami synchronizacji. Twoje założenie wydaje się więc prawidłowe.

+1

Przepraszamy za komentarz na temat tak starej odpowiedzi, ale ponieważ pytanie dotyczy Java * API *, a nie * implementacji * zapewnionej przez firmę Sun/Oracle, sprawdzanie, w jaki sposób JDK używa 'LockSupport' nie jest w 100% poprawne. Twórcy JDK mogą przyjąć założenia dotyczące własnej implementacji, podczas gdy aplikacja przenośna nie powinna. Ponadto istnieją sposoby na osiągnięcie relacji * happen-before *, która nie obejmuje żadnych bloków 'zsynchronizowanych'. – rolve

+0

"... przejrzałem kod JDK": Czy możesz z przyjemnością opublikować URL hg dla OpenJDK? – kevinarpe

5

Jeśli nie jest to udokumentowane jako takie, NIE MOŻNA polegać na tym, tworząc relację przed rozpoczęciem.

W szczególności LockSupport.java w kodzie Hotspot po prostu wywołuje Unsafe.park i .unpark!

Zdarza się, że przed dzieje się z pary odczytu zapisu na lotnej flagi stanu lub coś podobnego.

Pamiętaj, że jeśli nie jest udokumentowane jak tworzenie dzieje, zanim relacji wtedy musi traktować go tak, jakby to nie, nawet jeśli może udowodnić, że to nie od konkretnego systemu. Przyszłe systemy i wdrożenia mogą nie być. Pozostawili sobie tę wolność z ważnego powodu.

6

Właśnie znalazłem to pytanie, ponieważ zadawałem sobie to samo. Według this article przez badacza Oracle David Dice, odpowiedź wydaje się być nie. Poniżej znajduje się odpowiednia część artykułu:

Jeśli wątek jest zablokowany w park() mamy zagwarantowane, że późniejsza unpark() będzie to gotowy. Niezwykle legalna, ale niskiej jakości implementacja implementacji park() i byłaby pustymi metodami, w których program degeneruje się do prostego wirowania. W rzeczywistości jest to test lakmusowy dla prawidłowego użytkowania.

Empty park() i unpark() metody nie daje żadnych dzieje, zanim relacji gwarancji, więc na program w 100% przenośne, nie należy na nich polegać.

Potem znowu, Javadoc of LockSupport mówi:

Metody te są przeznaczone do stosowania jako narzędzia do tworzenia wyższego poziomu narzędzia synchronizacji i nie są same w sobie przydatna dla większości zastosowań kontroli współbieżności. Metoda park jest przeznaczone do użytku tylko w konstrukcjach o postaci:

while (!canProceed()) { ... LockSupport.park(this); }

Skoro masz jawnie sprawdzić jakiś warunek tak, który albo będzie obejmować volatile lub prawidłowo zsynchronizowane zmienne, słabe gwarancje park() nie powinien być problemem, prawda?

+2

Dziękuję za tę odpowiedź. Nie pamiętam już, dlaczego chciałem to wiedzieć. Podejrzewam, że zastanawiałem się, czy gdy działający wątek zaktualizował warunek i wywołał "unpark", gdyby to samo w sobie gwarantowało, że wątek przestanie widzieć warunek zaktualizowany w stanie spójnym. Wydaje się, że nie ma żadnej gwarancji, więc jedynym bezpiecznym wyborem jest jawne ustalenie bariery pamięci dla aktualizacji warunku. – Lachlan

+0

Rozumiem. Jeśli istniała relacja * happen-before * między 'park()' i 'unpark()', warunek nie musiałby obejmować bariery pamięci. Pytanie wciąż jest aktualne. – rolve