CopyOnWriteArraySet
Este é o irmão mais novo da turma
CopyOnWriteArrayList
. Este é um conjunto especializado de classes adicionado no JDK 1.5 junto com seu primo mais popular
ConcurrentHashMap
. Eles fazem parte
concurrent collection framework
e estão localizados no pacote
java.util.concurrent
.
CopyOnWriteArraySet
Mais adequado para coleções somente leitura com tamanho pequeno o suficiente para serem copiadas se ocorrerem algumas operações de modificação. Por exemplo, você pode usar
CopyOnWriteArraySet
para armazenar um objeto quando o aplicativo é iniciado e fazer com que vários outros threads acessem esse objeto durante todo o ciclo de vida do aplicativo. Se um novo estado ou objeto chegar durante esse período, ele também poderá ser adicionado a este
Set
, ao custo da criação de um novo array. Uma das coisas mais importantes a saber
CopyOnWriteArraySet
é que ele é implementado usando
CopyOnWriteArrayList
. Isso significa que ele
CopyOnWriteArraySet
também compartilha todas as propriedades básicas do
CopyOnWriteArrayList
. Outra coisa importante a lembrar é que os iteradores desta classe de coleção não suportam o
remove()
. A tentativa de remover um elemento durante a integração resultará em um valor discrepante
UnsupportedOperationException
. Isso é feito para garantir velocidade durante o rastreamento. Atravessar esta implementação
Set
usando um iterador é bastante rápido e evita interferência de outros threads. Para operar, os iteradores dependem de um instantâneo da matriz que foi obtido quando o iterador foi criado. Resumindo, use
CopyOnWriteArraySet
se for
set
pequeno o suficiente para copiar ao adicionar, definir ou excluir objetos, e o objetivo principal é ler dados atualizados esporadicamente. Além disso, se você deseja remover elementos durante a iteração, não use esta implementação porque seu iterador não suporta
remove()
e lança
java.lang.UnsupportedOperationException
, conforme mostrado abaixo:
[RAJ] Event received : FOUR
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.concurrent.CopyOnWriteArrayList$COWIterator.remove(Unknown Source)
at Publisher.notifySubs(HelloHP.java:43)
at HelloHP.main(HelloHP.java:23)
Exemplo de CopyOnWriteArraySet em Java
Aqui está um programa Java pronto mostrando como usar o
CopyOnWriteArraySet
. Em nosso exemplo, usamos o padrão editor
-subscriber para demonstrar seu uso. A maioria dos assinantes é assinada durante o lançamento do aplicativo e a principal tarefa do editor é enumerá-los e notificá-los sobre quaisquer atualizações. Adições e exclusões de assinantes podem ocorrer de tempos em tempos. Como precisamos de um bypass rápido,
CopyOnWriteArraySet
esta é uma boa escolha, especialmente em um ambiente multithread onde um thread pode adicionar um assinante enquanto outro thread cuida das atualizações.
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArraySet;
public class CopyOnWriteArraySetDemo{
public static void main(String args[]) {
Publisher cricNext = new Publisher();
SubScriber raj = new SubScriber("RAJ");
SubScriber adom = new SubScriber("ADOM");
cricNext.addSubscriber(raj);
cricNext.addSubscriber(adom);
cricNext.notifySubs("FOUR");
cricNext.notifySubs("SIX");
}
}
class Publisher {
private CopyOnWriteArraySet setOfSubs = new CopyOnWriteArraySet();
public void addSubscriber(SubScriber sub) {
setOfSubs.add(sub);
}
public void notifySubs(String score) {
Iterator itr = setOfSubs.iterator();
while (itr.hasNext()) {
SubScriber sub = itr.next();
sub.receive(score);
}
}
}
class SubScriber {
private String _name;
public SubScriber(String name) {
this._name = name;
}
public void receive(String score) {
System.out.printf("[%s] Event received : %s %n", _name, score);
}
}
Saída:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX
O que lembrar
CopyOnWriteArraySet
implementa as interfaces
Collection
e
Set
, bem como adicionadas no JDK 1.5, junto com outra implementação personalizada de
Set
'a,
EnumSet
. É também
Set
aquele que utiliza internal
CopyOnWriteArrayList
para todas as suas operações. Assim, ele compartilha as mesmas propriedades básicas desta classe. Como não é
SortedSet
, a ordem dos elementos não é garantida durante a iteração.
-
CopyOnWriteArraySet
Mais adequado para aplicações onde:
- Os tamanhos
Set
dos 's tendem a permanecer pequenos.
- As operações
read-only
são significativamente superiores às operações que modificam objetos.
- Você deve evitar interferência entre threads durante a travessia
Set
.
- Outra vantagem
CopyOnWriteArraySet
é a segurança do thread. Esta coleção oferece suporte à simultaneidade.
- As operações mutativas (adição, modificação, exclusão, etc.) são caras porque normalmente exigem a cópia de todo o array subjacente.
- Os iteradores não suportam a operação de exclusão mutativa.
- A travessia usando um iterador é bastante rápida e durante ela a interferência de outros threads é excluída. Para operar, os iteradores dependem de um instantâneo da matriz que foi obtido quando o iterador foi criado.
Isso é tudo sobre uso
CopyOnWriteArraySet
em Java. Como eu disse, ele é o irmão mais novo
CopyOnWriteArrayList
. Portanto, se você entende pelo menos um deles, pode usar o outro. A única diferença é que um é
List
'' e o outro
Set
é '', então isso implica herdar todas as diferenças entre essas estruturas de dados em Java. Por exemplo,
List
a ordem dos elementos é importante e pode conter duplicatas. Embora
Set
não ordenado, não permite a duplicação de objetos. Lembre-se sempre de que
CopyOnWriteArraySet
esta é uma aula especializada
Collection
. Só deve ser utilizado quando as condições forem favoráveis. Em qualquer outro caso, você pode usar implementações de uso geral. Por exemplo,
HashSet
ou
LinkedHashSet
classes de coleção sincronizadas. Original:
Como usar CopyOnWriteArraySet em Java com exemplo
GO TO FULL VERSION