CopyOnWriteArraySet
Бул класстын иниси
CopyOnWriteArrayList
. Булар JDK 1.5ке кошулган класстардын адистештирилген топтому жана алардын көбүрөөк таанымал тууганы
ConcurrentHashMap
. Алар
concurrent collection framework
пакеттин бир бөлүгү жана анын ичинде жайгашкан
java.util.concurrent
.
CopyOnWriteArraySet
Кээ бир өзгөртүү операциялары ишке ашса көчүрүлө турган өлчөмдөрү аз болгон окуу үчүн гана жыйнактар үчүн эң ылайыктуу. Мисалы, сиз
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;
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);
}
}
Чыгуу:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX
Эмнени эстеш керек
CopyOnWriteArraySet
жана интерфейстерин , ошондой эле JDK 1.5ке кошулган, башка 'a
Collection
, . Ал ошондой эле бардык операциялары үчүн ички колдонот . Ошентип, ал ушул класстын негизги касиеттерин бөлүшөт. Болбогондуктан , итерация учурунда элементтердин тартиби кепилдикке алынbyte.
Set
Set
EnumSet
Set
CopyOnWriteArrayList
SortedSet
-
CopyOnWriteArraySet
Тиркемелер үчүн эң ылайыктуу:
Set
нын өлчөмдөрү кичинекей бойдон калууда.
- Операциялар
read-only
an objectтерди өзгөртүүчү операциялардан бир топ жогору.
- Сиз өтүү учурунда жиптердин ортосундагы тоскоолдуктарды болтурбооңуз керек
Set
.
- Дагы бир артыкчылыгы
CopyOnWriteArraySet
жип коопсуздугу болуп саналат. Бул жыйнак параллелдүүлүктү колдойт.
- Мутативдик операциялар (кошуу, өзгөртүү, жок кылуу ж.б.) кымбатка турат, анткени алар, адатта, бардык негизги массивди көчүрүүнү талап кылат.
- Итераторлор мутациялоочу жок кылуу операциясын колдобойт.
- Итератордун жардамы менен өтүү абдан тез жана анын жүрүшүндө башка жиптердин кийлигишүүсү алынып салынат. Иштөө үчүн, итераторлор итератор түзүлгөндө алынган массивдин сүрөтүнө таянышат.
Мунун баары
CopyOnWriteArraySet
Java'да колдонуу жөнүндө. Мен айткандай, ал иниси
CopyOnWriteArrayList
. Демек, алардын жок дегенде бирин түшүнсөңүз, экинчисин колдонсоңуз болот. Бир гана айырмасы - бири
List
'', экинчиси
Set
'', ошондуктан бул Javaдагы бул маалымат структураларынын ортосундагы бардык айырмачылыктарды мурастап алууну талап кылат. Мисалы,
List
элементтердин тартиби маанилүү жана дубликаттарды камтышы мүмкүн. Тартипсиз болсо да
Set
, an objectтердин кайталанышына жол бербейт.
CopyOnWriteArraySet
Бул атайын класс экенин унутпа
Collection
. Ал ыңгайлуу шарттар болгондо гана колдонулушу керек. Башка учурларда, сиз жалпы максаттагы ишке ашырууларды колдоно аласыз. Мисалы,
HashSet
,
LinkedHashSet
же синхрондуу чогултуу класстары. Түпнуска:
Мисал менен Java ичинде CopyOnWriteArraySet кантип колдонсо болот
GO TO FULL VERSION