سؤال

فكر في متغير نوع بدائي مع الكثير من قراءة مؤشرات الترابط وكتابة عدد قليل من مؤشرات الترابط ، هل سيعمل الكود التالي بشكل صحيح؟

إذا ستفعل ذلك ، فهل يوفر أداء أفضل من 1). إعلان متزامن على جميع الأساليب ؛ 2). باستخدام readWritelock صريح؟

هل هذا نمط شائع؟ إذا لم يكن الأمر كذلك ، فما النمط المستخدم عادة في هذا الموقف؟

هذا يعمل بشكل جيد بالنسبة لي ، لكنني أشعر أنه من الضروري بعض الشيء لاستخدام كل من المتقلبة والمزامنة.

private volatile int value = 1;

public void func1()
{
    if (value == 1) {
        // do something
    }
}

public void func2()
{
    if (value == 2) {
        // do something
    }
}

public void func3()
{
    if (value == 3) {
        // do something
    }
}

public synchronized void increase()
{
    if (value < 10) value++;
}

public synchronized void decrease()
{
    if (value > 0) value--;
}
هل كانت مفيدة؟

المحلول

فكر في متغير نوع بدائي مع الكثير من قراءة مؤشرات الترابط وكتابة عدد قليل من مؤشرات الترابط ، هل سيعمل الكود التالي بشكل صحيح؟

أعتقد ذلك.

إذا ستفعل ذلك ، فهل يوفر أداء أفضل من 1). إعلان متزامن على جميع الأساليب ؛ 2). باستخدام readWritelock صريح؟

أعتقد ذلك ، شريطة أن تكون عمليات القراءة تفوق عدد طلبات الكتابة. لكن:

  • ما لم يتم تنظيم هذا العداد بشكل كبير ، فمن المحتمل أن لا يهم. لا تضيع وقتك في تحسين شيء ما إلا إذا كان لديك دليل على أنه (أو سيكون) عنق الزجاجة.
  • إذا كان الأمر مهمًا لك حقًا ، فسيكون ذلك.
  • لا تفاجأ إذا كان الأداء النسبي يعتمد على إصدارات JVM / مستويات التصحيح وخيارات JVM والأجهزة ؛ على سبيل المثال أعداد المعالجات وبنية الذاكرة.

هل هذا نمط شائع؟ إذا لم يكن الأمر كذلك ، فما النمط المستخدم عادة في هذا الموقف؟

لا أعرف ما إذا كان هذا أمرًا شائعًا. لكن شعوري الغريزي هو أن النهج الأكثر شيوعًا هو مجرد استخدام المزامنة المنتظمة ، ولا تقلق بشأنه. ما لم تكن تتعامل مع بنية بيانات منافسة للغاية ، فإن فرق الأداء بين الأساليب المختلفة سيكون غير مهم لأداء التطبيق بشكل عام.

نصائح أخرى

نعم ، إنه أمر شائع ، على الأقل إلى حد ما :)

تم وصف النمط الذي تستخدمه في مقالة IBM هذه -> http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html

(النمط رقم 5 ، خدعة قفل القراءة والكتابة الرخيصة)

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

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