JavaRush /Java блогу /Random-KY /Java'да CopyOnWriteArraySetти кантип колдонуу керек, миса...
Lam-lam
Деңгээл

Java'да CopyOnWriteArraySetти кантип колдонуу керек, мисалы (котормо)

Группада жарыяланган
CopyOnWriteArraySetБул класстын иниси CopyOnWriteArrayList. Булар JDK 1.5ке кошулган класстардын адистештирилген топтому жана алардын көбүрөөк таанымал тууганы ConcurrentHashMap. Алар concurrent collection frameworkпакеттин бир бөлүгү жана анын ичинде жайгашкан java.util.concurrent. CopyOnWriteArraySetти Java ичинде кантип колдонуу керек, мисалы (которуу) - 1CopyOnWriteArraySetКээ бир өзгөртүү операциялары ишке ашса көчүрүлө турган өлчөмдөрү аз болгон окуу үчүн гана жыйнактар ​​үчүн эң ылайыктуу. Мисалы, сиз CopyOnWriteArraySetтиркеме башталганда an objectти сактоо үчүн колдонсоңуз болот жана бир нече башка жиптерге колдонмонун иштөө цикли бою ал an objectке кирүү мүмкүнчүлүгүн бере аласыз. SetЭгерде бул убакыттын ичинде жаңы абал же an object келсе, ал жаңы массивди түзүү баасына кошулушу мүмкүн . Эң маанилүү нерселердин бири CopyOnWriteArraySet- бул колдонуу менен ишке ашырылышы CopyOnWriteArrayList. Бул анын CopyOnWriteArraySetбардык негизги касиеттерин бөлүшөт дегенди билдирет CopyOnWriteArrayList. Дагы бир маанилүү нерсе, бул коллекция классынын итераторлору remove(). Интеграция учурунда элементти алып салуу аракети чектен чыгууга алып келет UnsupportedOperationException. Бул сойлоп жатканда ылдамдыгын камсыз кылуу үчүн жасалат. SetИтератордун жардамы менен бул ишке ашыруу өтө тез жана башка жиптердин кийлигишүүсүн алдын алат. Иштөө үчүн, итераторлор итератор түзүлгөндө алынган массивдин сүрөтүнө таянышат. Кыскача айтканда, an objectтерди кошууда, орнотууда же жок кылууда көчүрүү үчүн кичинекей CopyOnWriteArraySetболсо , колдонуңуз жана негизги максат - мезгил-мезгor менен жаңыртылган маалыматтарды окуу. setОшондой эле, эгер сиз итерация учурунда элементтерди алып салгыңыз келсе, бул ишке ашырууну колдонбоңуз, анткени анын итератору колдоого алынbyte 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 үлгүсүн колдондук. Көпчүлүк абоненттер тиркемени ишке киргизүү учурунда жазылышат жана чыгаруучунун негизги милдети - аларды санап чыгуу жана ар кандай жаңыртуулар жөнүндө билдирүү. Абоненттик толуктоолор жана өчүрүүлөр мезгил-мезгor менен болушу мүмкүн. Бизге тез айланып өтүү керек болгондуктан, 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

Эмнени эстеш керек

CopyOnWriteArraySetжана интерфейстерин , ошондой эле JDK 1.5ке кошулган, башка 'a Collection, . Ал ошондой эле бардык операциялары үчүн ички колдонот . Ошентип, ал ушул класстын негизги касиеттерин бөлүшөт. Болбогондуктан , итерация учурунда элементтердин тартиби кепилдикке алынbyte. SetSetEnumSetSetCopyOnWriteArrayListSortedSetCopyOnWriteArraySetти Java ичинде кантип колдонуу керек, мисалы (которуу) - 2
  1. CopyOnWriteArraySetТиркемелер үчүн эң ылайыктуу:

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