امزج متطاير ومزامنة كقفل القراءة والكتابة
-
28-09-2019 - |
سؤال
فكر في متغير نوع بدائي مع الكثير من قراءة مؤشرات الترابط وكتابة عدد قليل من مؤشرات الترابط ، هل سيعمل الكود التالي بشكل صحيح؟
إذا ستفعل ذلك ، فهل يوفر أداء أفضل من 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 ، خدعة قفل القراءة والكتابة الرخيصة)
أنا متأكد من أنه يوفر أداء أفضل ، نظرًا لعدم وجود قفل ، ولكن ما إذا كان هذا صحيحًا يعتمد على نية الكود. بالتأكيد ، يختلف السلوك عن الحالة المتزامنة. ما إذا كان السلوك مشابهًا لحالة القفل يعتمد على المكان الذي تقفله.