In che modo la copia su raccolte di scritture fornisce sicurezza di thread e in quali scenari sono utili da implementare?In che modo la copia su raccolte di scritture fornisce sicurezza thread?
risposta
CopyOnWriteArrayList
un'istanza di CopyOnWriteArrayList si comporta come implementazione List che permette concorrente più letture, e per legge al verificarsi in concomitanza con una scrittura. Il modo in cui lo fa è quello di creare una nuova copia della lista ogni volta che viene modificata.
- Le letture non bloccano e effettivamente pagano solo il costo di una lettura volatile.
- Le scritture non bloccano le letture (o viceversa), ma può verificarsi una sola scrittura alla volta.
- A differenza di
ConcurrentHashMap
, le operazioni di scrittura che scrivono o accedono a più elementi nell'elenco (comeaddAll()
,retainAll()
) saranno atomiche.
Durante un'operazione di scrittura, la matrice deve essere bloccata completamente contro altre scritture. (L'implementazione standard utilizza un ReentrantLock .) Tuttavia, ciò significa che, come accennato, le operazioni che interessano più posizioni possono essere atomiche. Cioè, se un thread aggiunge diversi elementi alla lista con addAll() mentre un altro thread chiama size(), il thread che legge le dimensioni otterrà un valore che riflette o meno il numero di elementi aggiunti in addAll(): lì Non ci sarà alcuna possibilità di un valore intermedio restituito (a condizione ovviamente che questi siano gli unici due thread che accedono alla lista!).
CopyOnWriteArrayList è stato progettato per i casi in cui reads hugely outnumber writes
.
CopyOnWriteArraySet
Un'altra classe, CopyOnWriteArraySet
è costruire sulla parte superiore del CopyOnWriteArrayList
. Come la sua controparte lista, è progettato per i casi in cui il set contiene solo pochi elementi e dove le letture superano di gran lunga il numero delle scritture.
Riferimento: Java copy-on-write collections
Come funziona il meccanismo di blocco in questo caso? Ad esempio, se un thread scorre l'elenco, leggendo gli elementi nell'elenco, avrebbe acquisito il blocco sull'oggetto list e durante l'acquisizione del blocco come avrebbe potuto leggerlo da altri thread ?? Come mai le letture non stanno bloccando ?? – prvn
Per la lettura non acquisisce il blocco. Il blocco viene utilizzato solo quando si verifica un aggiornamento sull'array. – YoungHobbit
The [get()] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/CopyOnWriteArrayList.java#CopyOnWriteArrayList.get% 28int% 29) metodo non ha alcun blocco in cui come [set()] (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) prima acquisire il blocco quindi elaborato. – YoungHobbit
Il modo in cui lo fa è di fare una nuova copia della lista ogni volta che viene alterato.
Le letture non bloccano e effettivamente pagano solo il costo di una lettura volatile. Le scritture non bloccano le letture (o viceversa), ma può verificarsi una sola scrittura alla volta.
- 1. In che modo SAML fornisce realmente sicurezza?
- 2. Sicurezza thread di log4net
- 3. Funzione thread strtok sicurezza
- 4. Le scritture asincrone su un thread socket sono sicure?
- 5. Copia permessi/autenticazione su thread figlio ...?
- 6. In che modo thread-safe è V4L2?
- 7. Ottimizzazione di enormi scritture su disco
- 8. Sicurezza di primavera: in che modo la sicurezza di Spring registra una nuova sessione in SessionRegistry?
- 9. In che modo Rust fornisce la semantica del movimento?
- 10. Sicurezza thread delle mappe C++
- 11. Le operazioni di linq su raccolte simultanee thread safe?
- 12. Sicurezza thread di JTextArea.append
- 13. Sicurezza thread di ruby / rails
- 14. Migliore sicurezza del tipo nelle raccolte Java
- 15. FILTER_VALIDATE_EMAIL di PHP fornisce una sicurezza adeguata?
- 16. Come testare la sicurezza del thread
- 17. A cosa serve la sicurezza senza thread?
- 18. Sicurezza thread di :: new in C++ 11
- 19. Sicurezza thread in classe Java
- 20. Come disabilitare la sicurezza del thread in PHP?
- 21. WPF Sicurezza thread threading?
- 22. Interblocco fornisce visibilità in tutti i thread?
- 23. Ottenere la differenza di due raccolte strutturate in modo diverso
- 24. ActiveScaffold thread-sicurezza
- 25. Rubrica sicurezza e prestazioni thread
- 26. Sicurezza thread NSMutableDictionary
- 27. In che modo Google fornisce i risultati così velocemente?
- 28. middleware rack e sicurezza thread
- 29. Migliorare la sicurezza dell'accesso tramite negazione di copia e incolla?
- 30. In che modo la stringa Java è immutabile e aumenta la sicurezza?
Si noti che la copia su scrittura può anche evitare ConcurrentModificationExceptions all'interno di un singolo thread. – Thilo
http://javamex.com/tutorials/synchronization_concurrency_8_copy_on_write.shtml – Thilo