Oznaczanie zmiennej jako volatile
w języku Java zapewnia, że każdy wątek widzi wartość, która została do niego zapisana, zamiast jakiejś nieaktualnej wartości. Zastanawiałem się, jak to właściwie zostało osiągnięte. Czy JVM emituje specjalne instrukcje, które powodują opróżnienie procesora lub coś w tym stylu?Jak działa lotność?
Odpowiedz
Z tego co rozumiem, zawsze pojawia się tak, jakby pamięć podręczna została opróżniona po zapisaniu i zawsze pojawia się tak, jakby odczyty były wykonywane bezpośrednio z pamięci podczas odczytu. Efekt jest taki, że wątek zawsze będzie wyświetlał wyniki zapisów z innego wątku i (zgodnie z modelem pamięci Java) nigdy nie będzie wartością buforowaną. Rzeczywiste instrukcje implementacji i procesora różnią się jednak w zależności od architektury.
Nie gwarantuje poprawności, jeśli inkrementujesz zmienną w więcej niż jednym wątku, lub sprawdzasz jej wartość i podejmujesz pewne działania, ponieważ oczywiście nie ma faktycznej synchronizacji. Generalnie można zagwarantować tylko poprawne wykonanie, jeśli do zmiennej jest tylko zapis Wątku, a inne czytają.
Zauważ również, że 64-bitową zmienną NON-volatile można odczytać/zapisać jako dwie 32-bitowe zmienne, więc 32-bitowe zmienne są zapisane w trybie atomowym, ale 64-bitowe nie. Jedna połowa może być napisana przed inną - więc odczytana wartość może być mniejsza od starej lub nowej wartości.
Jest to dość pomocny strona z moich zakładek:
@jgubby: ostatni akapit nie wydaje się poprawny: nie można odczytać 64-bitowej zmiennej, która miałaby 32 bity z jednego zapisu, a druga 32 bity z innego zapisu. – SyntaxT3rr0r
@WizardOfOdds: uzgodniono. Chciałbym tam powiedzieć zmienną nielotną. – gubby
@jbuggy: ah ah, to właśnie myślałem, ale nie odważyłem się edytować twojego postu, ponieważ nie byłem pewien co masz na myśli :) Cieszę się, że pomogłem, bo w przeciwnym razie było to trochę mylące :))) – SyntaxT3rr0r
Dokładnie to, co się dzieje, zależy od procesora. Zasadniczo istnieją pewne instrukcje dotyczące barier pamięci. Opróżnianie całej pamięci podręcznej byłoby oczywiście bardzo kosztowne - w sprzęcie są protokoły koherencji pamięci podręcznej.
Ważne jest również to, że niektóre optymalizacje nie są wykonywane przez dostęp do pól. Kompilator jest ważny przy rozważaniu wielowątkowości, nie myśl tylko o sprzęcie.
Dokładnie to, co dzieje się w poprawnie napisanym programie Java, nie jest specyficzne dla procesora. – gubby
@jgubby Pytanie brzmi, czy emitowane są specjalne instrukcje. –
- 1. Przykład kodu C, który demonstruje lotność podczas demontażu?
- 2. Jak działa ta funkcja javascript/Struktura działa
- 3. Jak działa aktywacja oprogramowania?
- 4. Jak działa plik .RGS?
- 5. Jak działa System.Threading.Monitor.Enter()?
- 6. Jak działa CorFlags.exe/32BIT +?
- 7. Jak działa Pex?
- 8. Jak działa .insert?
- 9. Jak działa rejestracja domeny?
- 10. Jak działa pobieranie HTTP?
- 11. Jak działa OpenID?
- 12. OpenGL - Jak działa przezroczystość?
- 13. jak działa presentPopoverFromRect?
- 14. Jak działa Request.IsAuthenticated?
- 15. Jak/kiedy działa "after_filter"?
- 16. Jak działa JavaScript []?
- 17. Jak działa nameof?
- 18. Jak działa indeks Mongodb?
- 19. Jak działa geocoder Google?
- 20. Jak działa @tailrec
- 21. Jak działa wpisywanie bloku?
- 22. DirectX - Jak działa VertexBuffer?
- 23. Jak działa System.out.print()?
- 24. Jak działa curry (==)?
- 25. Jak działa powiadomienie Akka
- 26. @XmlRegistry - jak to działa?
- 27. Jak działa metoda Take()?
- 28. jak działa webRTC?
- 29. Jak działa funkcja waitForAngularEnabled?
- 30. Jak działa ZipInputStream.getNextEntry()?
pytanie pokrewne (pierwszy na liście faktycznie ..) http://stackoverflow.com/questions/1787450/how-do- i-understand-read-memory-barriers-and-volatile – BalusC
I wątek, który zacząłem na lotny z dużą ilością "upvotes" i "ulubionych" dotyczących wykonania poza kolejnością: http://stackoverflow.com/questions/2441279/java-volatile-gwarantuje-i-wykonanie-rzędu – SyntaxT3rr0r