JavaRush /وبلاگ جاوا /Random-FA /نحوه استفاده از CopyOnWriteArraySet در جاوا با مثال (ترجم...
Lam-lam
مرحله

نحوه استفاده از CopyOnWriteArraySet در جاوا با مثال (ترجمه)

در گروه منتشر شد
CopyOnWriteArraySetاین برادر کوچکتر کلاس است CopyOnWriteArrayList. اینها مجموعه ای تخصصی از کلاس ها هستند که در JDK 1.5 به همراه پسر عموی محبوب ترشان اضافه شده اند ConcurrentHashMap. آنها بخشی از concurrent collection frameworkبسته بندی هستند و در آن قرار دارند java.util.concurrent. نحوه استفاده از CopyOnWriteArraySet در جاوا با مثال (ترجمه) - 1CopyOnWriteArraySetبهترین گزینه برای مجموعه‌های فقط خواندنی است که به اندازه کافی کوچک هستند تا در صورت انجام برخی عملیات‌های اصلاحی کپی شوند. به عنوان مثال، شما می توانید 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;

/**
 * Java program to demonstrate how to use CopyOnWriteArraySet in Java. Remember,
 * CopyOnWriteArraySet doesn't support remove() operation.
 *
 * @author Javin Paul
 */
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);

            //itr.remove(); // not allowed, throws UnsupportedOperationException
        }
    }
}

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

چه چیزی را به خاطر بسپاریم

CopyOnWriteArraySetCollectionو رابط‌ها را پیاده‌سازی می‌کند Setو همچنین در JDK 1.5 اضافه شده است، همراه با یک پیاده‌سازی سفارشی دیگر از Set'a, EnumSet. همچنین یکی از مواردی است Setکه CopyOnWriteArrayListبرای تمام عملیات خود از داخلی استفاده می کند. بنابراین، ویژگی های اصلی این کلاس را به اشتراک می گذارد. از آنجایی که اینطور نیست SortedSet، ترتیب عناصر در طول تکرار تضمین نمی شود. نحوه استفاده از CopyOnWriteArraySet در جاوا با مثال (ترجمه) - 2
  1. CopyOnWriteArraySetبهترین گزینه برای برنامه هایی که در آنها:

    • اندازه های Set's تمایل دارند کوچک باقی بمانند.
    • عملیات read-onlyبه طور قابل توجهی برتر از عملیاتی است که اشیاء را تغییر می دهد.
    • شما باید از تداخل بین رشته ها در طول پیمایش جلوگیری کنید Set.
  2. مزیت دیگر CopyOnWriteArraySetایمنی نخ است. این مجموعه از همزمانی پشتیبانی می کند.
  3. عملیات جهشی (افزودن، اصلاح، حذف و غیره) گران هستند زیرا معمولاً نیاز به کپی کردن کل آرایه زیرین دارند.
  4. تکرار کننده ها از عملیات حذف جهشی پشتیبانی نمی کنند.
  5. پیمایش با استفاده از تکرار کننده بسیار سریع است و در طی آن تداخل رشته های دیگر حذف می شود. برای کارکرد، تکرارکننده‌ها به یک عکس فوری از آرایه که هنگام ایجاد تکرارگر گرفته شده است، تکیه می‌کنند.
همه چیز در مورد استفاده در جاوا است CopyOnWriteArraySet. همانطور که گفتم او برادر کوچکتر است CopyOnWriteArrayList. بنابراین اگر حداقل یکی از آنها را فهمیده اید، می توانید از دیگری استفاده کنید. تنها تفاوت این است که یکی List"" و دیگری Set"" است، بنابراین این مستلزم به ارث بردن تمام تفاوت های بین این ساختارهای داده در جاوا است. به عنوان مثال، Listترتیب عناصر مهم است و ممکن است حاوی موارد تکراری باشد. در حالی که Setمرتب نیست، اجازه تکرار اشیا را نمی دهد. همیشه به یاد داشته باشید که CopyOnWriteArraySetاین یک کلاس تخصصی است Collection. فقط زمانی باید استفاده شود که شرایط مساعد باشد. در هر حالت دیگری، می توانید از پیاده سازی های همه منظوره استفاده کنید. به عنوان مثال HashSet، LinkedHashSetیا کلاس های مجموعه همگام شده. اصل: نحوه استفاده از CopyOnWriteArraySet در جاوا با مثال
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION