W jaki sposób kopiowanie w kolekcjach zapisu zapewnia bezpieczeństwo wątków i w których scenariuszach są one przydatne do wdrożenia?W jaki sposób kopiowanie na kolekcjach zapisu zapewnia bezpieczeństwo wątków?
Odpowiedz
CopyOnWriteArrayList
Instancja CopyOnWriteArrayList zachowuje się jak listy, która umożliwia realizację wielu jednoczesnych czyta, czyta i występuje równocześnie z zapisu. W ten sposób tworzy się zupełnie nową kopię listy za każdym razem, gdy zostanie zmieniona.
- Odczyty nie blokują i skutecznie płacą tylko koszt zmiennego odczytu.
- Zapisy nie blokują odczytów (lub odwrotnie), ale może nastąpić tylko jedno zapisanie.
- W przeciwieństwie do
ConcurrentHashMap
, operacje zapisu, które zapisują lub uzyskują dostęp do wielu elementów na liście (takich jakaddAll()
,retainAll()
) będą atomowe.
Podczas operacji zapisu tablica musi być całkowicie zablokowana względem innych zapisów. (Standardowa implementacja używa ReentrantLock.) Jednakże, jak wspomniano, operacje mające wpływ na wiele lokalizacji mogą być atomowe. Oznacza to, że jeśli jeden wątek dodaje kilka elementów do listy za pomocą metody addAll(), podczas gdy inny wątek wywołuje size(), wątek odczytujący rozmiar otrzyma wartość, która odzwierciedla liczbę elementów dodanych w addAll(): lub nie. "nie będzie możliwości otrzymania wartości pośredniej zwróconej (oczywiście pod warunkiem, że są to jedyne dwa wątki uzyskujące dostęp do listy!).
CopyOnWriteArrayList przeznaczony jest do przypadków, w których reads hugely outnumber writes
.
CopyOnWriteArraySet
Inna klasa, CopyOnWriteArraySet
jest zbudowany na szczycie CopyOnWriteArrayList
. Podobnie jak jego odpowiednik w liście, jest przeznaczony dla przypadków, w których zestaw zawiera tylko kilka elementów, a liczba odczytów znacznie przewyższa liczbę zapisów.
referencyjny: Java copy-on-write collections
Jak działa mechanizm blokujący w tym przypadku? Na przykład Jeśli wątek przechodzi przez listę, czytając pozycje na liście, to uzyskałby on blokadę na obiekcie listy i podczas jej pozyskiwania blokady, jak mógłby to odczytać inny wątek? Dlaczego lektury nie blokują? – prvn
Do odczytu nie nabywa blokady. Blokada jest używana tylko wtedy, gdy aktualizacja odbywa się w tablicy. – YoungHobbit
[get()] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/CopyOnWriteArrayList.java#CopyOnWriteArrayList.get% 28int% 29) metoda nie ma żadnych blokad, gdzie jako [zestaw()] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/CopyOnWriteArrayList.java#CopyOnWriteArrayList.set%28int%2Cjava.lang.Object%29) najpierw nabyć blokadę następnie przetwarzane. – YoungHobbit
Sposób, w jaki sposób to zrobić nowiutki odpisu listy za każdym razem, gdy jest zmieniony.
Odczyty nie blokują i skutecznie płacą tylko koszt zmiennego odczytu. Zapisy nie blokują odczytów (lub odwrotnie), ale może nastąpić tylko jedno zapisanie.
- 1. Lepsze bezpieczeństwo typów w kolekcjach Java
- 2. Wiosna Singleton Bezpieczeństwo wątków
- 3. Interprocess SQLite Bezpieczeństwo wątków (w systemie iOS)
- 4. Bezpieczeństwo wątków WeakReference
- 5. W jaki sposób Rust zapewnia semantykę ruchu?
- 6. Bezpieczeństwo wątków: zmienne klas w języku Ruby
- 7. Jak testować bezpieczeństwo wątków
- 8. Bezpieczeństwo wątków NSMutableDictionary
- 9. W jaki sposób łańcuch znaków Java jest niezmienny zwiększa bezpieczeństwo?
- 10. Java StringBuilder i Bezpieczeństwo wątków
- 11. C odczyt i bezpieczeństwo wątków (linux)
- 12. Jaki jest najprostszy sposób zapisu na stdout w trybie binarnym?
- 13. Funkcje wielkości i bezpieczeństwo wątków w C++
- 14. Bezpieczeństwo wątków i System.Text.Encoding w języku C#
- 15. C# bezpieczeństwo wątków z get/set
- 16. msdn: Co to jest "Bezpieczeństwo wątków"?
- 17. Najlepszy sposób na statyczną inicjalizację Map w kolekcjach google
- 18. W jaki sposób system sizeof (struct) zapewnia zgodność z ABI?
- 19. Django, dynamiczne adresy URL, bezpieczeństwo wątków
- 20. Połączenia zwrotne WCF, proxy i bezpieczeństwo wątków
- 21. Bezpieczeństwo wątków Androida LruCache (Android 3.1)
- 22. Lucene.NET, StandardAnalyzer, stopwords i bezpieczeństwo wątków
- 23. Splice na kolekcjach
- 24. Bezpieczeństwo wątków biblioteki standardowej C na OS X
- 25. ReadOnlyCollection <T> Bezpieczeństwo wątków
- 26. Parallel.ForEach na liście <Object> Bezpieczeństwo wątków
- 27. wiosna-bezpieczeństwo, w jaki sposób ACL przyznaje uprawnienia
- 28. Pamięć zewnętrzna z odczytem Androida zapewnia bezpieczeństwo wyjątek
- 29. Jaki jest najlepszy sposób zapisu do pliku w Ruby?
- 30. W jaki sposób nie blokować odczytu/zapisu przez zdalny FileSystem
Należy pamiętać, że kopiowanie przy zapisie może również unikać ConcurrentModificationExceptions w obrębie pojedynczego wątku. – Thilo
http://javamex.com/tutorials/synchronization_concurrency_8_copy_on_write.shtml – Thilo