JavaRush /Java Blog /Random-TL /Paano gamitin ang CopyOnWriteArraySet sa Java na may hali...
Lam-lam
Antas

Paano gamitin ang CopyOnWriteArraySet sa Java na may halimbawa (pagsasalin)

Nai-publish sa grupo
CopyOnWriteArraySetIto ang nakababatang kapatid sa klase CopyOnWriteArrayList. Ito ay isang espesyal na hanay ng mga klase na idinagdag sa JDK 1.5 kasama ng kanilang mas sikat na pinsan ConcurrentHashMap. Ang mga ito ay bahagi ng concurrent collection frameworkat matatagpuan sa pakete java.util.concurrent. Paano gamitin ang CopyOnWriteArraySet sa Java na may halimbawa (pagsasalin) - 1CopyOnWriteArraySetPinakamahusay na angkop para sa mga read-only na koleksyon na may sapat na maliit na sukat upang makopya kung may nangyaring pagbabago sa mga operasyon. Halimbawa, maaari mong gamitin CopyOnWriteArraySetupang mag-imbak ng isang bagay kapag nagsimula ang application, at magkaroon ng maraming iba pang mga thread na ma-access ang bagay na iyon sa buong lifecycle ng application. Kung may dumating na bagong estado o bagay sa panahong ito, maaari rin itong idagdag sa isang ito Set, sa halaga ng paggawa ng bagong array. Isa sa mga pinakamahalagang bagay na dapat malaman CopyOnWriteArraySetay ang pagpapatupad nito gamit ang CopyOnWriteArrayList. Nangangahulugan ito CopyOnWriteArraySetna ibinabahagi rin nito ang lahat ng mga pangunahing katangian ng CopyOnWriteArrayList. Ang isa pang mahalagang bagay na dapat tandaan ay ang mga iterator ng klase ng koleksyon na ito ay hindi sumusuporta sa remove(). Ang pagtatangkang alisin ang isang elemento sa panahon ng pagsasama ay magreresulta sa isang outlier UnsupportedOperationException. Ginagawa ito upang matiyak ang bilis habang gumagapang. Ang pagtawid sa pagpapatupad na ito Setgamit ang isang iterator ay medyo mabilis at iniiwasan ang interference mula sa iba pang mga thread. Upang gumana, umaasa ang mga iterator sa isang snapshot ng array na kinuha noong ginawa ang iterator. Sa madaling salita, gamitin CopyOnWriteArraySetkung setsapat na maliit upang kopyahin kapag nagdaragdag, nagse-set, o nagde-delete ng mga bagay, at ang pangunahing layunin ay basahin ang data na paminsan-minsang na-update. Gayundin, kung gusto mong tanggalin ang mga elemento sa panahon ng pag-ulit, huwag gamitin ang pagpapatupad na ito dahil ang iterator nito ay hindi sumusuporta sa remove(), at throws java.lang.UnsupportedOperationException, tulad ng ipinapakita sa ibaba:
[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)

Halimbawa ng CopyOnWriteArraySet sa Java

Narito ang isang handa na Java program na nagpapakita kung paano gamitin ang CopyOnWriteArraySet. Sa aming halimbawa, ginamit namin ang pattern ng publisher -subscriber upang ipakita ang paggamit nito. Karamihan sa mga subscriber ay naka-subscribe sa panahon ng paglulunsad ng application at ang pangunahing gawain ng publisher ay ang pagbilang sa kanila at abisuhan sila ng anumang mga update. Ang mga pagdaragdag at pagtanggal ng subscriber ay maaaring mangyari paminsan-minsan. Dahil kailangan namin ng mabilis na bypass, CopyOnWriteArraySetito ay isang magandang pagpipilian, lalo na sa isang multi-threaded na kapaligiran kung saan ang isang thread ay maaaring magdagdag ng subscriber habang ang isa pang thread ay humahawak ng mga update.
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);
    }
}
Output:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX

Ano ang dapat tandaan

CopyOnWriteArraySetnagpapatupad ng Collectionat mga interface Set, pati na rin, idinagdag sa JDK 1.5, kasama ng isa pang custom na pagpapatupad ng Set'a, EnumSet. Isa rin itong Setgumagamit ng panloob CopyOnWriteArrayListpara sa lahat ng operasyon nito. Kaya, ito ay nagbabahagi ng parehong mga pangunahing katangian ng klase na ito. Dahil hindi ito SortedSet, ang pagkakasunud-sunod ng mga elemento ay hindi ginagarantiyahan sa panahon ng pag-ulit. Paano gamitin ang CopyOnWriteArraySet sa Java na may halimbawa (pagsasalin) - 2
  1. CopyOnWriteArraySetPinakamahusay na angkop para sa mga application kung saan:

    • Ang mga sukat Setng 's ay malamang na manatiling maliit.
    • Ang mga operasyon read-onlyay higit na nakahihigit sa mga pagpapatakbo na nagbabago ng mga bagay.
    • Dapat mong pigilan ang interference sa pagitan ng mga thread sa panahon ng traversal Set.
  2. Ang isa pang bentahe CopyOnWriteArraySetay ang kaligtasan ng thread. Sinusuportahan ng koleksyong ito ang concurrency.
  3. Ang mga mutative na operasyon (pagdaragdag, pagbabago, pagtanggal, atbp.) ay mahal dahil karaniwang nangangailangan ang mga ito ng pagkopya sa buong pinagbabatayan na array.
  4. Hindi sinusuportahan ng mga iterator ang mutative delete operation.
  5. Ang traversal gamit ang isang iterator ay medyo mabilis at sa panahon nito ay hindi kasama ang interference ng ibang mga thread. Upang gumana, umaasa ang mga iterator sa isang snapshot ng array na kinuha noong ginawa ang iterator.
Iyon lang ang tungkol sa paggamit CopyOnWriteArraySetsa Java. Gaya nga ng sabi ko, siya ang nakababatang kapatid CopyOnWriteArrayList. Kaya kung naiintindihan mo ang kahit isa sa kanila, maaari mong gamitin ang isa pa. Ang pagkakaiba lang ay ang isa ay List'' at ang isa Setay '', kaya't nangangailangan ito ng pagmamana ng lahat ng pagkakaiba sa pagitan ng mga istruktura ng data na ito sa Java. Halimbawa, Listang pagkakasunud-sunod ng mga elemento ay mahalaga at maaaring maglaman ng mga duplicate. Habang Sethindi nakaayos, hindi nito pinapayagan ang pagdoble ng mga bagay. Laging tandaan na CopyOnWriteArraySetito ay isang espesyal Collectionna klase. Dapat lamang itong gamitin kapag ang mga kondisyon ay paborable. Sa anumang iba pang kaso, maaari kang gumamit ng mga pangkalahatang layunin na pagpapatupad. Halimbawa, HashSet, LinkedHashSeto naka-synchronize na mga klase sa koleksyon. Orihinal: Paano gamitin ang CopyOnWriteArraySet sa Java na may Halimbawa
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION