سؤال

هل هناك أي ميزة استخدام

java.util.المتزامنة.CountdownLatch

بدلا من

java.util.المتزامنة.سيمافور?

بقدر ما أستطيع أن أقول التالية شظايا أي ما يعادل تقريبا:

1.سيمافور

final Semaphore sem = new Semaphore(0);
for (int i = 0; i < num_threads; ++ i)
{
  Thread t = new Thread() {
    public void run()
    {
      try
      {
        doStuff();
      }
      finally
      {
        sem.release();
      }
    }
  };
  t.start();
}

sem.acquire(num_threads);

2:CountDownLatch

final CountDownLatch latch = new CountDownLatch(num_threads);
for (int i = 0; i < num_threads; ++ i)
{
  Thread t = new Thread() {
    public void run()
    {
      try
      {
        doStuff();
      }
      finally
      {
        latch.countDown();
      }
    }
  };
  t.start();
}

latch.await();

إلا أنه في الحالة رقم 2 مزلاج لا يمكن إعادة استخدامها والأهم من ذلك عليك أن تعرف مسبقا كم من المواضيع سيتم إنشاء (أو الانتظار حتى يتم بدأ كل شيء قبل خلق المزلاج.)

حتى في حالة ما قد مزلاج يكون الأفضل ؟

هل كانت مفيدة؟

المحلول

العد التنازلي مزلاج كثيرا ما تستخدم في عكس المثال الخاص بك.عموما, سيكون لديك العديد من المواضيع حظر على "انتظار()" التي من شأنها أن نبدأ جميعا في وقت واحد عندما countown وصلت إلى الصفر.

final CountDownLatch countdown = new CountDownLatch(1);
for (int i = 0; i < 10; ++ i){
   Thread racecar = new Thread() {    
      public void run()    {
         countdown.await(); //all threads waiting
         System.out.println("Vroom!");
      }
   };
   racecar.start();
}
System.out.println("Go");
countdown.countDown();   //all threads start now!

هل يمكن أيضا استخدام هذه MPI على غرار "الحاجز" الذي يسبب كل المواضيع الانتظار مؤشرات الترابط الأخرى للحاق نقطة معينة قبل المتابعة.

final CountDownLatch countdown = new CountDownLatch(num_thread);
for (int i = 0; i < num_thread; ++ i){
   Thread t= new Thread() {    
      public void run()    {
         doSomething();
         countdown.countDown();
         System.out.printf("Waiting on %d other threads.",countdown.getCount());
         countdown.await();     //waits until everyone reaches this point
         finish();
      }
   };
   t.start();
}

أن كل ما يقال, العد التنازلي مزلاج يمكن أن تستخدم بأمان في الطريقة التي كنت قد بينت في المثال الخاص بك.

نصائح أخرى

CountDownLatch يستخدم لبدء سلسلة من المواضيع ثم انتظر حتى كلها كاملة (أو حتى استدعاء countDown() عدد معين من المرات.

إشارة يستخدم للتحكم في عدد المواضيع المتزامنة التي تستخدم الموارد.أن الموارد يمكن أن يكون شيئا مثل ملف ، أو يمكن أن تكون وحدة المعالجة المركزية عن طريق الحد من عدد من مؤشرات الترابط المنفذة.الاعتماد على إشارة يمكن أن تذهب صعودا وهبوطا حسب المواضيع المختلفة الاتصال acquire() و release().

في المثال الخاص بك ، أنت أساسا باستخدام إشارة كنوع من العدحتىمزلاج.نظرا إلى أن القصد الخاص هو الانتظار على جميع المواضيع التشطيب باستخدام CountdownLatch يجعل نيتك أكثر وضوحا.

ملخص قصير:

  1. سيمافور و CountDownLatch يخدم غرض مختلف.

  2. استخدام سيمافور للتحكم في موضوع الوصول إلى الموارد.

  3. استخدام CountDownLatch أن تنتظر الانتهاء من جميع المواضيع

سيمافور تعريف من javadocs:

A سيمافور تحتفظ مجموعة من التصاريح.كل الحصول على() كتل إذا لزم الأمر حتى تصريح يتوفر ثم يأخذ.كل الإفراج عن() يضيف تصريح ، ويحتمل أن الإفراج عن حجب الدامجة.

ومع ذلك ، لا الفعلية تصريح الكائنات ؛ على سيمافور فقط يبقى عدد عدد المتاحة ويتصرف وفقا لذلك.

كيف يعمل ؟

الإشارات تستخدم للسيطرة على عدد من المواضيع المتزامنة التي تستخدم الموارد.أن الموارد يمكن أن يكون شيئا مثل البيانات المشتركة أو كتلة من التعليمات البرمجية (مقطع حرج) أو أي ملف.

الاعتماد على إشارة يمكن أن تذهب صعودا وهبوطا حسب المواضيع المختلفة الاتصال acquire() ، release().ولكن في أي وقت, لا يمكنك الحصول على أكثر عدد من المواضيع أكبر من إشارة العد.

إشارة حالات الاستخدام:

  1. الحد من الوصول المتزامن القرص (هذا يمكن أن تقتل الأداء بسبب تتنافس القرص يسعى)
  2. إنشاء موضوع الحد
  3. JDBC تجمع الاتصال / الحد
  4. اتصال الشبكة اختناق
  5. اختناق وحدة المعالجة المركزية أو الذاكرة المكثفة المهام

إلقاء نظرة على هذا المادة بالنسبة إشارة الاستخدامات.

CountDownLatch تعريف من javadocs:

تزامن المساعدات التي تسمح واحد أو أكثر من المواضيع الانتظار حتى مجموعة من العمليات التي يتم تنفيذها في المواضيع الأخرى يكمل.

كيف يعمل ؟

CountDownLatch يعمل من خلال وجود تهيئة العداد مع عدد من المواضيع التي هي decremented كل مرة موضوع استكمال تنفيذه.عندما يصل العد إلى الصفر يعني كل المواضيع الانتهاء من التنفيذ و الموضوع في انتظار مزلاج استئناف التنفيذ.

CountDownLatch حالات الاستخدام:

  1. تحقيق أقصى قدر من التوازي:في بعض الأحيان نريد أن تبدأ عدد من المواضيع في نفس الوقت لتحقيق أقصى قدر من التوازي
  2. انتظر N المواضيع يكمل قبل بدء التنفيذ
  3. الكشف عن حالة توقف تام.

إلقاء نظرة على هذا المادة فهم CountDownLatch المفاهيم بوضوح.

إلقاء نظرة على شوكة الانضمام إلى تجمع في هذا المادة أيضا.لديها بعض أوجه التشابه CountDownLatch.

يقول كنت أمشي في لعبة غولف برو متجر ، على أمل أن تجد رباعية ،

عندما تقف في طابور للحصول على وقت المحملة من متجر للمحترفين الحاضرين ، أساسا اتصلت proshopVendorSemaphore.acquire(), عندما تحصل على نقطة الإنطلاق الوقت اتصلت proshopVendorSemaphore.release().ملاحظة:أي من الحاضرين أن خدمة ، أيالمورد المشترك.

الآن يمكنك المشي إلى كاتب ، وقال انه يبدأ CountDownLatch(4) ويدعو await() أن ننتظر من الآخرين على الجزء الذي يسمى فحص-في أي CountDownLatch.countDown() و كذلك بقية رباعية.عندما تصل كاتب يعطي المضي قدما(await() إرجاع المكالمة)

الآن بعد تسعة ثقوب عند كل من أخذ قسط من الراحة ، نظريا يتيح إشراك كاتب مرة أخرى ، كان يستخدم 'الجديدة' CountDownLatch(4) انطلق حفرة 10, نفس الانتظار/sync كما الثقب 1.

ومع ذلك ، إذا كان كاتب تستخدم CyclicBarrier أن تبدأ مع أنه يمكن أن يكون إعادة تعيين نفس المثال في حفرة 10 بدلا من الثانية مزلاج ، والتي تستخدم & رمي.

تبحث في ما هو متاح بحرية المصدر لا يوجد سحر في تنفيذ فئتين ، لذلك أدائها يجب أن يكون من نفس.اختيار واحد الذي يجعل نيتك أكثر وضوحا.

CountdownLatch يجعل المواضيع الانتظار في انتظار طريقة () ، حتى هذا الوقت كما أن العدد قد وصل إلى الصفر.لذلك ربما كنت تريد جميع المواضيع الخاصة بك إلى الانتظار حتى 3 الدعاء من شيء, ثم كل المواضيع يمكن أن تذهب.مزلاج عموما لا يمكن إعادة تعيين.

إشارة يسمح المواضيع لاسترداد تصاريح الذي يمنع الكثير من المواضيع من تنفيذ دفعة واحدة ، وعرقلة إذا كان لا يمكن الحصول على تصريح(s) فإنه يتطلب المضي قدما.تصاريح يمكن إرجاعها إلى إشارة السماح أخرى في انتظار المواضيع للمضي قدما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top