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
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.
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.
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óźniejszaunpark()
będzie to gotowy. Niezwykle legalna, ale niskiej jakości implementacja implementacjipark()
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?
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
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
- 1. In-memory LINQ performance
- 2. Django Performance/Memory usage
- 3. Scala Iterable Memory Leaks
- 4. Delphi Memory Issue (FastMM4)
- 5. Memory Limit Hit
- 6. WriteableBitmap Memory Leak?
- 7. Czy istnieją biblioteki Hierarchical Temporal Memory?
- 8. Perl map/grep memory leak
- 9. Memory Leak kiedy zachowując własność
- 10. Picture Box out of Memory
- 11. Scratch memory in managed environment
- 12. Uwzględnij ze strumienia "php: // memory"
- 13. istream vs memory mapowanie pliku?
- 14. Lisp, cffi, let and memory
- 15. Eclipse Memory Analyzer, ale zawsze pokazuje Wystąpił błąd wewnętrzny?
- 16. Objective C Structs and Memory Management
- 17. Czy Spiky Memory "Zdrowe" dla aplikacji?
- 18. Memory Management: NSString za stringWithCString: kodowanie:
- 19. angular2-in-memory-web-api Błąd 404
- 20. IE i Memory akumulacja w JavaScript
- 21. Czy Mongo DB ma tryb In-Memory?
- 22. Android: statycznych pól i Memory Wycieki
- 23. Out of Memory Error podczas załadunku bitmaps
- 24. <memory> nie jest plikiem BOMStorage
- 25. Poziomy Linux Kernel Memory Zarządzanie przywoławcze
- 26. React Native Memory Leakage Animation Issue
- 27. Czy mogę uruchomić LocalDb "in-memory"
- 28. Cython sum v/s mean memory jump
- 29. Narzędzie Xcode 6 Memory Leaks nie działa
- 30. angular-in-memory-web-api: ctorParameters.map nie jest funkcją
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
"... przejrzałem kod JDK": Czy możesz z przyjemnością opublikować URL hg dla OpenJDK? – kevinarpe