CopyOnWriteArraySet
Ito ang nakababatang kapatid sa klase
CopyOnWriteArrayList
. Ito ay isang espesyal na hanay ng mga klase na idinagdag sa JDK 1.5 kasama ng kanilang mas sikat na pinsan
ConcurrentHashMap
. Ang mga ito ay bahagi ng
concurrent collection framework
at matatagpuan sa pakete
java.util.concurrent
.
CopyOnWriteArraySet
Pinakamahusay na angkop para sa mga read-only na koleksyon na may sapat na maliit na sukat upang makopya kung may nangyaring pagbabago sa mga operasyon. Halimbawa, maaari mong gamitin
CopyOnWriteArraySet
upang mag-imbak ng isang bagay kapag nagsimula ang application, at magkaroon ng maraming iba pang mga thread na ma-access ang bagay na iyon sa buong lifecycle ng application. Kung may dumating na bagong estado o bagay sa panahong ito, maaari rin itong idagdag sa isang ito
Set
, sa halaga ng paggawa ng bagong array. Isa sa mga pinakamahalagang bagay na dapat malaman
CopyOnWriteArraySet
ay ang pagpapatupad nito gamit ang
CopyOnWriteArrayList
. Nangangahulugan ito
CopyOnWriteArraySet
na ibinabahagi rin nito ang lahat ng mga pangunahing katangian ng
CopyOnWriteArrayList
. Ang isa pang mahalagang bagay na dapat tandaan ay ang mga iterator ng klase ng koleksyon na ito ay hindi sumusuporta sa
remove()
. Ang pagtatangkang alisin ang isang elemento sa panahon ng pagsasama ay magreresulta sa isang outlier
UnsupportedOperationException
. Ginagawa ito upang matiyak ang bilis habang gumagapang. Ang pagtawid sa pagpapatupad na ito
Set
gamit ang isang iterator ay medyo mabilis at iniiwasan ang interference mula sa iba pang mga thread. Upang gumana, umaasa ang mga iterator sa isang snapshot ng array na kinuha noong ginawa ang iterator. Sa madaling salita, gamitin
CopyOnWriteArraySet
kung
set
sapat na maliit upang kopyahin kapag nagdaragdag, nagse-set, o nagde-delete ng mga bagay, at ang pangunahing layunin ay basahin ang data na paminsan-minsang na-update. Gayundin, kung gusto mong tanggalin ang mga elemento sa panahon ng pag-ulit, huwag gamitin ang pagpapatupad na ito dahil ang iterator nito ay hindi sumusuporta sa
remove()
, at throws
java.lang.UnsupportedOperationException
, tulad ng ipinapakita sa ibaba:
[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)
Halimbawa ng CopyOnWriteArraySet sa Java
Narito ang isang handa na Java program na nagpapakita kung paano gamitin ang
CopyOnWriteArraySet
. Sa aming halimbawa, ginamit namin ang pattern ng publisher
-subscriber upang ipakita ang paggamit nito. Karamihan sa mga subscriber ay naka-subscribe sa panahon ng paglulunsad ng application at ang pangunahing gawain ng publisher ay ang pagbilang sa kanila at abisuhan sila ng anumang mga update. Ang mga pagdaragdag at pagtanggal ng subscriber ay maaaring mangyari paminsan-minsan. Dahil kailangan namin ng mabilis na bypass,
CopyOnWriteArraySet
ito ay isang magandang pagpipilian, lalo na sa isang multi-threaded na kapaligiran kung saan ang isang thread ay maaaring magdagdag ng subscriber habang ang isa pang thread ay humahawak ng mga update.
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);
}
}
Output:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX
Ano ang dapat tandaan
CopyOnWriteArraySet
nagpapatupad ng
Collection
at mga interface
Set
, pati na rin, idinagdag sa JDK 1.5, kasama ng isa pang custom na pagpapatupad ng
Set
'a,
EnumSet
. Isa rin itong
Set
gumagamit ng panloob
CopyOnWriteArrayList
para sa lahat ng operasyon nito. Kaya, ito ay nagbabahagi ng parehong mga pangunahing katangian ng klase na ito. Dahil hindi ito
SortedSet
, ang pagkakasunud-sunod ng mga elemento ay hindi ginagarantiyahan sa panahon ng pag-ulit.
-
CopyOnWriteArraySet
Pinakamahusay na angkop para sa mga application kung saan:
- Ang mga sukat
Set
ng 's ay malamang na manatiling maliit.
- Ang mga operasyon
read-only
ay higit na nakahihigit sa mga pagpapatakbo na nagbabago ng mga bagay.
- Dapat mong pigilan ang interference sa pagitan ng mga thread sa panahon ng traversal
Set
.
- Ang isa pang bentahe
CopyOnWriteArraySet
ay ang kaligtasan ng thread. Sinusuportahan ng koleksyong ito ang concurrency.
- Ang mga mutative na operasyon (pagdaragdag, pagbabago, pagtanggal, atbp.) ay mahal dahil karaniwang nangangailangan ang mga ito ng pagkopya sa buong pinagbabatayan na array.
- Hindi sinusuportahan ng mga iterator ang mutative delete operation.
- Ang traversal gamit ang isang iterator ay medyo mabilis at sa panahon nito ay hindi kasama ang interference ng ibang mga thread. Upang gumana, umaasa ang mga iterator sa isang snapshot ng array na kinuha noong ginawa ang iterator.
Iyon lang ang tungkol sa paggamit
CopyOnWriteArraySet
sa Java. Gaya nga ng sabi ko, siya ang nakababatang kapatid
CopyOnWriteArrayList
. Kaya kung naiintindihan mo ang kahit isa sa kanila, maaari mong gamitin ang isa pa. Ang pagkakaiba lang ay ang isa ay
List
'' at ang isa
Set
ay '', kaya't nangangailangan ito ng pagmamana ng lahat ng pagkakaiba sa pagitan ng mga istruktura ng data na ito sa Java. Halimbawa,
List
ang pagkakasunud-sunod ng mga elemento ay mahalaga at maaaring maglaman ng mga duplicate. Habang
Set
hindi nakaayos, hindi nito pinapayagan ang pagdoble ng mga bagay. Laging tandaan na
CopyOnWriteArraySet
ito ay isang espesyal
Collection
na klase. Dapat lamang itong gamitin kapag ang mga kondisyon ay paborable. Sa anumang iba pang kaso, maaari kang gumamit ng mga pangkalahatang layunin na pagpapatupad. Halimbawa,
HashSet
,
LinkedHashSet
o naka-synchronize na mga klase sa koleksyon. Orihinal:
Paano gamitin ang CopyOnWriteArraySet sa Java na may Halimbawa
GO TO FULL VERSION