Kiedy używać volatile keyword vs synchronization w wielowątkowość?Kiedy używać volatile vs synchronization w wielowątkowość w java?
Odpowiedz
Użyj volatile
, aby zagwarantować, że każdy dostęp odczytu do zmiennej będzie widział najnowszą wartość zapisaną do tej zmiennej. Użyj wartości synchronized
, gdy potrzebujesz wartości, aby zachować stabilność dla wielu instrukcji. (Zauważ, że nie musi to oznaczać wiele instrukcji; pojedynczego komunikatu.
var++; // NOT thread safe!
jest nie wątku bezpieczny nawet jeśli var
deklaruje volatile
Trzeba to zrobić:
synchronized(LOCK_OBJECT){var++;}
See here za ładne podsumowanie tego numeru:
'AtomicLong' obsługuje' var ++ 'za pomocą metody i tylko' volatile'. Czy możesz edytować swoją odpowiedź, aby podać lepszy przykład? – Gray
@Gray - Okay. Moim "lepszym przykładem" jest to, że 'var' jest typu' float'. –
To dość szerokie pytanie. Najlepszą odpowiedzią, jaką mogę dać, jest użycie synchronized
podczas wykonywania wielu działań, które muszą być widoczne w innych wątkach jako występujące w postaci atomowej — - wszystkie lub żadne z kroków nie wystąpiły.
Dla pojedynczego działania może być wystarczająca wartość volatile
; działa jako bariera pamięci, aby zapewnić widoczność zmiany na inne wątki.
Funkcja "Lotna" zapewnia, że operacja odczytu zawsze zapewnia najnowszy stan z pamięci przez wątki. nie zapewniają żadnego bezpieczeństwa zapisu/porządkowania operacji, tj. dwa wątki mogą aktualizować zmienną lotność w dowolnej kolejności losowej. Również nie zapewnia, że wiele operacji na zmiennej jest atomowych.
Jednak zsynchronizowany blok zapewnia najnowszy stan i bezpieczeństwo zapisu. Również dostęp i aktualizacja zmiennej ma charakter atomowy wewnątrz zsynchronizowanego bloku. Powyższe jest jednak prawdziwe, tylko jeśli wszystkie dostęp/aktualizacje danej zmiennej korzystają z tego samego obiektu blokady, tak że w wielu momentach nic nie uzyskuje dostępu do zmiennej.
Ulotność nie zyskuje blokady, wykorzystuje bazową architekturę procesora, aby zapewnić widoczność we wszystkich wątkach po zapisie.
- 1. Kiedy używać volatile ze wspólną pamięcią CUDA
- 2. Wielowątkowość najlepsze praktyki w java
- 3. Kiedy używać Cassandra vs Solr w DSE?
- 4. Kiedy używać SQLITE_TRANSIENT vs SQLITE_STATIC?
- 5. Kiedy używać HtmlControls vs WebControls
- 6. Kiedy używać HttpMessageHandler vs ActionFilter?
- 7. Kiedy używać = domyślny vs = usuń
- 8. Kiedy używać approxfun vs. ok.
- 9. Kiedy powinieneś używać === vs ==,! == vs! =, Etc .. w javascript?
- 10. Kiedy powinniśmy używać dostawcy w Java 8?
- 11. Kiedy należy używać Mockery vs JUnit4Mockery?
- 12. Java Generic Interface vs Generic Methods, a kiedy używać jednego
- 13. Instrukcja "Kiedy" vs Java "switch"
- 14. Kiedy używać Class.isInstance() i kiedy używać operatora instanceof?
- 15. Zaawansowane wielowątkowość - Java
- 16. Wielowątkowość Java w laptopie z czterordzeniowym procesorem
- 17. Storm vs. Trident: Kiedy nie używać Trident?
- 18. Kiedy używać Haystack/ElasticSearch vs ORM Django
- 19. Kiedy należy używać `publishReplay` vs` shareReplay`?
- 20. Couchbase - Kiedy powinienem używać N1QL vs Widoki?
- 21. https vs ssl- kiedy używać co
- 22. KIEDY używać serializacji vs zwykły POST
- 23. Kiedy w Railsach należy używać `DateTime.now.utc` vs.` Time.current.utc`?
- 24. Async/Await VS Task.Run: Kiedy używać? Jak używać?
- 25. apt vs wsgen vs wsimport. Konfundowanie na temat czego używać i kiedy nie używać innego
- 26. Delphi TList w wielowątkowość
- 27. Wielowątkowość: Kiedy powinienem użyć opcji Dołącz?
- 28. synchronization- Temat Kiedy nitki zwolnić blokadę na obiekcie
- 29. Kiedy używać TemplateBinding i TemplatedParent w WPF
- 30. kiedy używać === sprawdzanie operatora w JavaScript?
http://stackoverflow.com/questions/3214938/java-volatile-modifier-andsynchronized-blocks i szybki goggling pokaże wiele informacji –
duplikowanie? https://stackoverflow.com/questions/9851133/ –