CopyOnWriteArraySet
Ин бародари хурдии синф аст
CopyOnWriteArrayList
. Инҳо маҷмӯи махсуси синфҳо мебошанд, ки дар JDK 1.5 ҳамроҳ бо ҷияни маъмултарини онҳо илова карда шудаанд
ConcurrentHashMap
. Онҳо як қисми баста
concurrent collection framework
ва дар баста ҷойгиранд
java.util.concurrent
.
CopyOnWriteArraySet
Беҳтарин барои маҷмӯаҳои танҳо барои хондан мувофиқ аст, ки ҳаҷмаш ба қадри кофӣ хурд аст, ки дар сурати ба амал омадани баъзе амалиёти тағирдиҳӣ нусхабардорӣ карда шаванд. Масалан, шумо метавонед
CopyOnWriteArraySet
барои нигоҳ доштани an object ҳангоми оғози барнома истифода баред ва якчанд риштаҳои дигар ба он an object дар давоми давраи ҳаёти барнома дастрасӣ пайдо кунед. Агар дар давоми ин вақт ҳолати нав ё an objectи нав ворид шавад, он метавонад ба ин ҳолат низ илова карда шавад
Set
, бо нархи сохтани массиви нав. Яке аз муҳимтарин чизҳои донистани он
CopyOnWriteArraySet
аст, ки он бо истифода аз
CopyOnWriteArrayList
. Ин маънои онро дорад, ки он
CopyOnWriteArraySet
инчунин тамоми хосиятҳои асосии
CopyOnWriteArrayList
. Чизи муҳими дигаре, ки бояд дар хотир дошт, ин аст, ки итераторҳои ин синфи коллексия
remove()
. Кӯшиши аз байн бурдани элемент ҳангоми ҳамгироӣ боиси аз ҳад зиёд мешавад
UnsupportedOperationException
. Ин барои таъмини суръат дар вақти хазандагон анҷом дода мешавад. Гузаронидани ин татбиқ
Set
бо истифода аз итератор хеле зуд аст ва аз дахолати риштаҳои дигар пешгирӣ мекунад. Барои кор кардан, итераторҳо ба акси массив, ки ҳангоми сохтани итератор гирифта шудааст, такя мекунанд. Хулоса, ҳангоми илова кардан, насб кардан ё нест кардани an objectҳо
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)
Намунаи CopyOnWriteArraySet дар Java
Дар ин ҷо як барномаи тайёри 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
дохorро истифода мебарад .
CopyOnWriteArrayList
Ҳамин тариқ, он дорои ҳамон хосиятҳои асосии ин синф мебошад. Азбаски он нест
SortedSet
, тартиби элементҳо ҳангоми такрор кафолат дода намешавад.
-
CopyOnWriteArraySet
Беҳтарин барои барномаҳое мувофиқ аст, ки дар он ҷо:
- Андозаи
Set
''ҳо одатан хурд боқӣ мемонанд.
- Амалиётҳо
read-only
нисбат ба амалиётҳое, ки an objectҳоро тағир медиҳанд, хеле бартарӣ доранд.
- Ҳангоми гузариш шумо бояд дахолати байни риштаҳоро пешгирӣ кунед
Set
.
- Афзалияти дигар
CopyOnWriteArraySet
бехатарии ришта мебошад. Ин маҷмӯа ҳамоҳангиро дастгирӣ мекунад.
- Амалиётҳои мутативӣ (илова кардан, тағир додан, нест кардан ва ғ.) гарон мебошанд, зеро онҳо маъмулан нусхабардории тамоми массиви асосиро талаб мекунанд.
- Итераторҳо амалиёти тозакунии мутативро дастгирӣ намекунанд.
- Гузариш бо истифода аз итератор хеле зуд аст ва ҳангоми он дахолати риштаҳои дигар истисно карда мешавад. Барои кор кардан, итераторҳо ба акси массив, ки ҳангоми сохтани итератор гирифта шудааст, такя мекунанд.
Ин ҳама дар бораи истифода
CopyOnWriteArraySet
дар Java аст. Тавре гуфтам, ӯ бародари хурдӣ аст
CopyOnWriteArrayList
. Пас, агар шумо ақаллан яке аз онҳоро фаҳмед, шумо метавонед дигарашро истифода баред. Ягона тафовут дар он аст, ки яке
List
'' ва дигаре
Set
'' аст, бинобар ин, ин мерос гирифтани тамоми фарқиятҳои байни ин сохторҳои додаҳо дар Java мебошад. Масалан,
List
тартиби элементҳо муҳим аст ва метавонад такрорҳоро дар бар гирад. Дар ҳоле ки
Set
бетартиб, он такрори an objectҳоро иҷозат намедиҳад. Ҳамеша дар хотир доред, ки
CopyOnWriteArraySet
ин як синфи махсус аст
Collection
. Он бояд танҳо дар ҳолати мусоид истифода шавад. Дар ҳама ҳолатҳои дигар, шумо метавонед татбиқи таъиноти умумиро истифода баред. Масалан,
HashSet
,
LinkedHashSet
ё синфҳои коллексияи ҳамоҳангшуда. Асл:
Чӣ тавр истифода бурдани CopyOnWriteArraySet дар Java бо мисол
GO TO FULL VERSION