JavaRush /Blogue Java /Random-PT /Como usar CopyOnWriteArraySet em Java com exemplo (traduç...
Lam-lam
Nível 30

Como usar CopyOnWriteArraySet em Java com exemplo (tradução)

Publicado no grupo Random-PT
CopyOnWriteArraySetEste é 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 frameworke estão localizados no pacote java.util.concurrent. Como usar CopyOnWriteArraySet em Java com exemplo (tradução) - 1CopyOnWriteArraySetMais 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 CopyOnWriteArraySetpara 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 CopyOnWriteArraySettambé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 Setusando 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 CopyOnWriteArraySetse for setpequeno 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, CopyOnWriteArraySetesta é 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;

/**
 * Java program to demonstrate how to use CopyOnWriteArraySet in Java. Remember,
 * CopyOnWriteArraySet doesn't support remove() operation.
 *
 * @author Javin Paul
 */
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);

            //itr.remove(); // not allowed, throws UnsupportedOperationException
        }
    }
}

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

CopyOnWriteArraySetimplementa as interfaces Collectione Set, bem como adicionadas no JDK 1.5, junto com outra implementação personalizada de Set'a, EnumSet. É também Setaquele que utiliza internal CopyOnWriteArrayListpara 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. Como usar CopyOnWriteArraySet em Java com exemplo (tradução) - 2
  1. CopyOnWriteArraySetMais adequado para aplicações onde:

    • Os tamanhos Setdos 's tendem a permanecer pequenos.
    • As operações read-onlysão significativamente superiores às operações que modificam objetos.
    • Você deve evitar interferência entre threads durante a travessia Set.
  2. Outra vantagem CopyOnWriteArraySeté a segurança do thread. Esta coleção oferece suporte à simultaneidade.
  3. 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.
  4. Os iteradores não suportam a operação de exclusão mutativa.
  5. 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 CopyOnWriteArraySetem 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, Lista ordem dos elementos é importante e pode conter duplicatas. Embora Setnão ordenado, não permite a duplicação de objetos. Lembre-se sempre de que CopyOnWriteArraySetesta é 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, HashSetou LinkedHashSetclasses de coleção sincronizadas. Original: Como usar CopyOnWriteArraySet em Java com exemplo
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION