سؤال

ما هو الفرق بين المجموعات. أنا لا أرى أي اختلاف لأنك مجموعات .SynchronizedMap () يحافظ داخليا على نفس القفل لجميع الأساليب.

أساسا، ما هو الفرق بين مقتطفات التعليمات البرمجية التالية

Class C {    
    Object o;

    public void foo() {
       synchronized(o) {
           // thread safe code here
       }
    }
}

و

Class C {
    Object o;

    public synchronized void foo() {

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

المحلول

هناك فرق واحد فقط:

مجموعات هو قادر لاستخدام شاشة مختلفة من نفسه.

استخدام الأساليب المتزامنة هو نفسه باستخدام sychnchonized(this)-اختر، مما يعني أن المجمع سيكون الشاشة ويمكن أن يكون مغلقا من الخارج من المجمع.

إذا كنت لا تريد تطبيق خارجي لقفل الشاشة، فأنت بحاجة إلى إخفاءها.

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

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

نصائح أخرى

كلا النهجين يكتسبان الشاشة على الكائن، وكذلك يجب أن يؤدي نفس الشيء. السبب الرئيسي للفرق هو المعمارية. يتيح التفاف المتزامن لتوسيع الاختلاف الآمن غير صحيح غير صحيح.

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

لا تعيد اختراع العجلة واستخدام ما يتم توفيره بواسطة API.

يجب عليك دائما تزيين كل شيء بدلا من جمع كل شيء وكل الخوف إلى فئة مميزة واحدة كبيرة.

دائما تأخذ الخريطة العادية وتزيينها مع مجموعات أو استخدام java.util.concurrent واستخدام قفل حقيقي، لذلك يمكن للمرء فحص وتحديث الخريطة بطريقة بحرية. غدا قد ترغب في تغيير hashtable إلى تريماب وسوف تكون في ورطة إذا كانت عالقة مع hashtable.

لذلك، لماذا تسأل؟ :) هل تعتقد حقا أنه إذا تم وضع الفصل في حزمة Java.util، فإن بعض السحر يحدث ورمز Java الخاص به يعمل بطريقة صعبة؟

إنه حقا يلف جميع الأساليب ذات الكتلة المتزامنة {} ولا شيء أكثر.

UPD: الفرق هو أن لديك فرص أقل بكثير ارتكبت خطأ إذا كنت تستخدم المجموعة المتزامنة بدلا من القيام بجميع الأشياء المزامنة بنفسك.

UPD 2: كما ترون في مصادر يستخدمون "كائن MUTEX'- كشاشة. عند استخدام المعدل المتزامن في توقيع الطريقة (أي synchronized void doSmth()) المثيل الحالي لكائنك (أي this) يستخدم كشاشة. كتلتين من التعليمات البرمجية أدناه هي هي نفسها:

1.

synchronized public void doSmth () {
   someLogic ();
   moreLogic ();
}

synchronized public static void doSmthStatic () {
   someStaticLogic ();
   moreStaticLogic ();
}

2.

public void doSmth () {
   synchronized (this) {
      someLogic ();
      moreLogic ();
   }
}

public static void doSmthStatic () {
   synchronized (ClassName.class) {
      someStaticLogic ();
      moreStaticLogic ();
   }
}

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

أ) مؤشرات الترابطات التي تنتظر عملياتها في نقاط مختلفة تماما في الخريطة ستكون في انتظار نفس القفل. بناء على عدد مؤشرات الترابط، يمكن أن يؤثر ذلك على أداء التطبيق.

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

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