To samo dla wszystkich innych obiektów atomowych? Łatwiej jest wyjaśnić pytanie AtomicInteger. Ponieważ więcej niż 1 wątek uzyskuje dostęp do odwołania do myInt, czy nie jest możliwe, że jeden wątek widzi zarejestrowaną wartość w pamięci podręcznej, na przykład null, dla tego obiektu, chyba że jest on również zadeklarowany jako niestabilny? Jeśli nie, to dlaczego?Czy konieczne jest zadeklarowanie AtomicReference jako zmiennej?
Odpowiedz
Nie tylko nie jest to konieczne, ale w rzeczywistości jest błędne semantycznie. AtomicReference
przechowuje "rzeczywiste" odwołanie w sobie i zarządza dostępem do niego za pomocą własnych konstrukcji synchronizacji. Własne konstrukcje synchronizacji JVM (synchronized
, , itp.) I nie są używane. Sam obiekt AtomicReference
nie powinien być traktowany jako zmienny. Jeśli cokolwiek, rozważ zrobienie tego final
.
Rozważ także this question - volatile
może być uważana za alternatywę dla używania AtomicReference
, jeśli wszystko czego potrzebujesz to operacje pobierania i ustawiania.
Dlaczego nie? Współbieżna mapa mogłaby być trzymana przez zmienne pole z uzasadnionego powodu, i nie rozumiem, dlaczego nie powinno to być prawdą w przypadku "atomowych" obiektów? –
@Nieno: Oczywiście, przypuszczam, że mógłbyś wymyślić scenariusz, w którym byłoby to właściwe. Jeśli jednak zobaczysz kod "volatile AtomicReference" w kodzie, prawie na pewno nie będzie to zgodne z zamierzeniami autora. – skaffman
@skaffman: Oczywiście AtomicReferance zawiera prawdziwe odniesienie do obiektu docelowego w sobie, ale mam na myśli odniesienie do tego obiektu AtomicReference. Ale naprawdę mogę to uczynić ostatecznym i ma to również sens. Dzięki! –
Obiekty "atomowe" nie są niezmienne, więc powinny być bezpieczne tylko pod warunkiem, że zostaną poprawnie opublikowane. Na przykład, gdy zrobisz coś takiego, będziesz musiał użyć zmiennego słowa kluczowego.
volatile AtomicInteger counter = // initialize counter
int harvest(){
AtomicInteger old = counter;
counter = new AtomicInteger();
return old.get();
}
Jeśli usuniesz lotny z powyższego kodu, możesz rzeczywiście stracić kilka przyrostów. Zgodnie ze specyfikacją można również uzyskać odwołanie do obiektu AtomicInteger, który nie jest w pełni skonstruowany, a tym samym uzyskać niezdefiniowane zachowanie.
Czy należy zatem zadeklarować swój obiekt atomowy jako zmienny? Odpowiedź jest zależna. Są bezpieczne tylko tak długo, jak długo są poprawnie publikowane, tak jak inne bezpieczne obiekty (z wyjątkiem niezmiennych obiektów, które są przypadkami specjalnymi). W większości przypadków powinieneś zrobić je ostatecznym.
- 1. Interfejs Obiektyw-C - zadeklarowanie zmiennej vs własność?
- 2. Czy executePendingTransactions() jest zawsze konieczne?
- 3. Czy konieczne jest wyrażenie math.sqrt()?
- 4. Dlaczego konieczne jest zadeklarowanie ivar i własności o tej samej nazwie?
- 5. Jak ustalić, czy Kopiowanie lokalne jest konieczne?
- 6. Czy możliwe jest zadeklarowanie metody Objective-C poza klasą?
- 7. Czy konieczne jest stałe pobieranie w RXTX?
- 8. Czy konieczne jest wypisanie się z wydarzeń?
- 9. Czy konieczne jest usunięcie w destruktorze?
- 10. Czy konieczne jest ustawienie domeny NetworkCredential?
- 11. Czy konieczne jest użycie Forever.js na OpenShift?
- 12. Erlang, Czy konieczne jest zamknięcie pliku tutaj?
- 13. Czy konieczne jest użycie InitCommonControlsEx() i InitCommonControls()?
- 14. Czy konieczne jest tutaj `std :: move`?
- 15. Czy konieczne jest zamknięcie strumienia metody WebInvoke
- 16. Czy zadeklarowanie usuniętej funkcji nie ma sensu?
- 17. Czy obiekt Funkcja konieczne
- 18. Przechowywanie hasła sudo jako zmiennej w skrypcie - czy jest bezpieczne?
- 19. Java lotnych odniesienia vs. AtomicReference
- 20. Czy konieczne jest sprawdzenie, czy element ma atrybut?
- 21. Czy konieczne jest umieszczenie Unicorn za Nginx (lub Apache)?
- 22. Czy konieczne jest przekonwertowanie argumentów na tablicę przed wywołaniem zastosowania?
- 23. Czy konieczne jest dodanie znaku @ przed nazwą parametru SqlParameter?
- 24. Czy wywołanie funkcji DispatchMessage w programach win32 jest konieczne?
- 25. Czy konieczne jest uruchomienie jstack -F jako root (w systemie Linux), a jeśli tak, to dlaczego?
- 26. Czy konieczne jest, aby wiadomość delegata zawsze miała nieważność jako typ zwrotu?
- 27. Jaka jest różnica między AtomicReference <Integer> vs. AtomicInteger?
- 28. Jaka jest różnica między przypisaniem zmiennej jako obiektu i przypisaniem zmiennej jako notacji obiektowej/konstruktorem obiektów?
- 29. Czy konieczne jest wyrejestrowanie gniazda z epola przed jego zamknięciem?
- 30. Czy konieczne jest wycofanie transakcji w bloku catch?
Staram się, aby wszystkie pola AtomicReference były ostateczne. Powinieneś nigdy nie zmieniać tego. –