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)
مثال CopyOnWriteArraySet در جاوا
در اینجا یک برنامه جاوا آماده است که نحوه استفاده از آن را نشان می دهد
CopyOnWriteArraySet
.
در مثال خود، از الگوی ناشر - مشترک برای نشان دادن کاربرد آن استفاده کردیم . اکثر مشترکین در طول راه اندازی برنامه مشترک می شوند و وظیفه اصلی ناشر این است که آنها را برشمرده و هر گونه به روز رسانی را به آنها اطلاع دهد. افزودن و حذف مشترکین ممکن است هر از گاهی رخ دهد. از آنجایی که ما به یک دور زدن سریع نیاز داریم،
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
's تمایل دارند کوچک باقی بمانند.
- عملیات
read-only
به طور قابل توجهی برتر از عملیاتی است که اشیاء را تغییر می دهد.
- شما باید از تداخل بین رشته ها در طول پیمایش جلوگیری کنید
Set
.
- مزیت دیگر
CopyOnWriteArraySet
ایمنی نخ است. این مجموعه از همزمانی پشتیبانی می کند.
- عملیات جهشی (افزودن، اصلاح، حذف و غیره) گران هستند زیرا معمولاً نیاز به کپی کردن کل آرایه زیرین دارند.
- تکرار کننده ها از عملیات حذف جهشی پشتیبانی نمی کنند.
- پیمایش با استفاده از تکرار کننده بسیار سریع است و در طی آن تداخل رشته های دیگر حذف می شود. برای کارکرد، تکرارکنندهها به یک عکس فوری از آرایه که هنگام ایجاد تکرارگر گرفته شده است، تکیه میکنند.
همه چیز در مورد استفاده در جاوا است
CopyOnWriteArraySet
. همانطور که گفتم او برادر کوچکتر است
CopyOnWriteArrayList
. بنابراین اگر حداقل یکی از آنها را فهمیده اید، می توانید از دیگری استفاده کنید. تنها تفاوت این است که یکی
List
"" و دیگری
Set
"" است، بنابراین این مستلزم به ارث بردن تمام تفاوت های بین این ساختارهای داده در جاوا است. به عنوان مثال،
List
ترتیب عناصر مهم است و ممکن است حاوی موارد تکراری باشد. در حالی که
Set
مرتب نیست، اجازه تکرار اشیا را نمی دهد. همیشه به یاد داشته باشید که
CopyOnWriteArraySet
این یک کلاس تخصصی است
Collection
. فقط زمانی باید استفاده شود که شرایط مساعد باشد. در هر حالت دیگری، می توانید از پیاده سازی های همه منظوره استفاده کنید. به عنوان مثال
HashSet
،
LinkedHashSet
یا کلاس های مجموعه همگام شده. اصل:
نحوه استفاده از CopyOnWriteArraySet در جاوا با مثال
GO TO FULL VERSION