JavaRush /Java блогы /Random-KK /CopyOnWriteArraySet-ті Java-да мысалмен (аударма) қалай п...
Lam-lam
Деңгей

CopyOnWriteArraySet-ті Java-да мысалмен (аударма) қалай пайдалануға болады

Топта жарияланған
CopyOnWriteArraySetБұл сыныптың інісі CopyOnWriteArrayList. Бұл JDK 1.5 жүйесінде олардың танымал немере ағасымен бірге қосылған арнайы сыныптар жинағы ConcurrentHashMap. Олар бір бөлігі болып табылады concurrent collection frameworkжәне пакетте орналасқан java.util.concurrent. CopyOnWriteArraySet-ті Java-да мысалмен (аударма) пайдалану жолы - 1CopyOnWriteArraySetКейбір өзгерту әрекеттері орын алған жағдайда көшірілетін өлшемдері жеткілікті шағын тек оқуға арналған жинақтар үшін ең қолайлы. Мысалы, CopyOnWriteArraySetқолданба іске қосылғанда нысанды сақтау үшін пайдалануға болады және қолданбаның өмірлік циклі бойына сол нысанға бірнеше басқа ағындар қатынасуы мүмкін. SetОсы уақыт ішінде жаңа күй немесе нысан келсе, оны жаңа массив жасау құнына қосуға болады . Білуге ​​болатын ең маңызды нәрселердің бірі CopyOnWriteArraySet- оны пайдалану арқылы жүзеге асыру CopyOnWriteArrayList. Бұл оның CopyOnWriteArraySetбарлық негізгі қасиеттерімен бөлісетінін білдіреді CopyOnWriteArrayList. Есте сақтау керек тағы бір маңызды нәрсе - бұл жинақ класының итераторлары remove(). Интеграция кезінде элементті жою әрекеті шектен тыс мәнге әкеледі UnsupportedOperationException. Бұл тексеріп шығу кезінде жылдамдықты қамтамасыз ету үшін жасалады. SetИтератор арқылы бұл іске асыру өте жылдам және басқа ағындардың кедергісін болдырмайды. Жұмыс істеу үшін итераторлар иератор жасалған кезде алынған массивтің суретіне сүйенеді. Қысқаша айтқанда, нысандарды қосу, орнату немесе жою кезінде көшіру үшін жеткілікті кішкентай болса CopyOnWriteArraySetпайдаланыңыз және негізгі мақсат кездейсоқ жаңартылатын деректерді оқу болып табылады. Сондай-ақ, итерация кезінде элементтерді жойғыңыз келсе, бұл іске асыруды пайдаланбаңыз, себебі оның итераторы төменде көрсетілгендей setқолдамайды remove()және тастайды :java.lang.UnsupportedOperationException
[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)

Java тіліндегі CopyOnWriteArraySet мысалы

Мұнда қалай пайдалану керектігін көрсететін дайын Java бағдарламасы берілген CopyOnWriteArraySet. Біздің мысалда біз оны пайдалануды көрсету үшін publisher -subscriber үлгісін қолдандық. Қолданбаны іске қосу кезінде жазылушылардың көпшілігі жазылады және шығарушының негізгі міндеті - оларды санау және кез келген жаңартулар туралы хабарлау. Жазылушыларды қосу және жою мезгіл-мезгіл орын алуы мүмкін. Бізге жылдам айналып өту қажет болғандықтан, CopyOnWriteArraySetбұл жақсы таңдау, әсіресе бір ағын жазылушыны қоса алатын, ал басқа ағын жаңартуларды өңдейтін көп ағынды ортада.
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);
    }
}
Шығару:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX

Нені есте сақтау керек

CopyOnWriteArraySetCollectionжәне интерфейстерін Set, сондай-ақ JDK 1.5-те қосылған басқа Set'a, EnumSet. Ол сондай-ақ өзінің барлық операциялары үшін Setішкі пайдаланады CopyOnWriteArrayList. Осылайша, ол осы сыныптың бірдей негізгі қасиеттерін бөліседі. Ол болмағандықтан SortedSet, итерация кезінде элементтердің ретіне кепілдік берілмейді. CopyOnWriteArraySet-ті Java-да мысалмен (аударма) пайдалану жолы - 2
  1. CopyOnWriteArraySetҚолданбалар үшін ең қолайлы:

    • Өлшемдері Setкішкентай болып қалады.
    • Операциялар read-onlyan objectілерді өзгертетін операциялардан айтарлықтай жоғары.
    • Айналу кезінде жіптер арасындағы кедергілерді болдырмау керек Set.
  2. Тағы бір артықшылығы CopyOnWriteArraySet- жіп қауіпсіздігі. Бұл жинақ параллельділікке қолдау көрсетеді.
  3. Мутативті операциялар (қосу, өзгерту, жою және т.б.) қымбатқа түседі, себебі олар әдетте барлық негізгі массивді көшіруді қажет етеді.
  4. Итераторлар мутациялы жою операциясын қолдамайды.
  5. Итератор арқылы өту өте жылдам және оның барысында басқа ағындардың кедергісі жоққа шығарылады. Жұмыс істеу үшін итераторлар иератор жасалған кезде алынған массивтің суретіне сүйенеді.
Мұның бәрі CopyOnWriteArraySetJava-да пайдалану туралы. Мен айтқанымдай, ол інісі CopyOnWriteArrayList. Сондықтан олардың кем дегенде біреуін түсінсеңіз, екіншісін пайдалана аласыз. Жалғыз айырмашылық мынада: біреуі List'', екіншісі Set'', сондықтан бұл Java-дағы осы деректер құрылымдары арасындағы барлық айырмашылықтарды мұраға алуды талап етеді. Мысалы, Listэлементтердің реті маңызды және қайталануларды қамтуы мүмкін. Реттеусіз болған кезде Setол нысандардың қайталануына жол бермейді. CopyOnWriteArraySetБұл мамандандырылған сынып екенін әрқашан есте сақтаңыз Collection. Ол қолайлы жағдайлар болған кезде ғана қолданылуы керек. Кез келген басқа жағдайда сіз жалпы мақсаттағы енгізулерді пайдалана аласыз. Мысалы, HashSet, LinkedHashSetнемесе синхрондалған жинақ сыныптары. Түпнұсқа: CopyOnWriteArraySet-ті Java-да мысалмен қалай пайдалануға болады
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION