CopyOnWriteArraySet
Бұл сыныптың інісі
CopyOnWriteArrayList
. Бұл JDK 1.5 жүйесінде олардың танымал немере ағасымен бірге қосылған арнайы сыныптар жинағы
ConcurrentHashMap
.
Олар бір бөлігі болып табылады concurrent collection framework
және пакетте орналасқан java.util.concurrent
. CopyOnWriteArraySet
Кейбір өзгерту әрекеттері орын алған жағдайда көшірілетін өлшемдері жеткілікті шағын тек оқуға арналған жинақтар үшін ең қолайлы. Мысалы, 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;
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
Collection
және интерфейстерін Set
, сондай-ақ JDK 1.5-те қосылған басқа Set
'a, EnumSet
. Ол сондай-ақ өзінің барлық операциялары үшін Set
ішкі пайдаланады CopyOnWriteArrayList
. Осылайша, ол осы сыныптың бірдей негізгі қасиеттерін бөліседі. Ол болмағандықтан SortedSet
, итерация кезінде элементтердің ретіне кепілдік берілмейді.
-
CopyOnWriteArraySet
Қолданбалар үшін ең қолайлы:
- Өлшемдері
Set
кішкентай болып қалады.
- Операциялар
read-only
an objectілерді өзгертетін операциялардан айтарлықтай жоғары.
- Айналу кезінде жіптер арасындағы кедергілерді болдырмау керек
Set
.
- Тағы бір артықшылығы
CopyOnWriteArraySet
- жіп қауіпсіздігі. Бұл жинақ параллельділікке қолдау көрсетеді.
- Мутативті операциялар (қосу, өзгерту, жою және т.б.) қымбатқа түседі, себебі олар әдетте барлық негізгі массивді көшіруді қажет етеді.
- Итераторлар мутациялы жою операциясын қолдамайды.
- Итератор арқылы өту өте жылдам және оның барысында басқа ағындардың кедергісі жоққа шығарылады. Жұмыс істеу үшін итераторлар иератор жасалған кезде алынған массивтің суретіне сүйенеді.
Мұның бәрі CopyOnWriteArraySet
Java-да пайдалану туралы. Мен айтқанымдай, ол інісі CopyOnWriteArrayList
. Сондықтан олардың кем дегенде біреуін түсінсеңіз, екіншісін пайдалана аласыз. Жалғыз айырмашылық мынада: біреуі List
'', екіншісі Set
'', сондықтан бұл Java-дағы осы деректер құрылымдары арасындағы барлық айырмашылықтарды мұраға алуды талап етеді. Мысалы, List
элементтердің реті маңызды және қайталануларды қамтуы мүмкін. Реттеусіз болған кезде Set
ол нысандардың қайталануына жол бермейді. CopyOnWriteArraySet
Бұл мамандандырылған сынып екенін әрқашан есте сақтаңыз Collection
. Ол қолайлы жағдайлар болған кезде ғана қолданылуы керек. Кез келген басқа жағдайда сіз жалпы мақсаттағы енгізулерді пайдалана аласыз. Мысалы, HashSet
, LinkedHashSet
немесе синхрондалған жинақ сыныптары. Түпнұсқа: CopyOnWriteArraySet-ті Java-да мысалмен қалай пайдалануға болады
GO TO FULL VERSION