سؤال

لذلك دعنا نقول لدي ن تم إعداد مجموعة الخادم ذات الحجم مثل SO:

alt text http://www.terracotta.org/web/download/attachments/43909161/ServerArrayMirRorgroup.png

لدي جافابان/بوجو بسيطة:

package example;

public class Person {
  private OtherObject obj;

  public void setObj(OtherObject theObj) {
    synchronized (this) {
      obj = theObj;
    }
  }

  public OtherObject getObj() {
    synchronized (this) {
      return obj;
    }
  }
}

الآن إذا قام أحد العملاء بالاتصال بـ person.setObj (OtherObject) على كائن شخص في جذر TC (بنية البيانات) ، هو كتلة متزامنة (في شخص

1) حتى كل شيء ن من الخوادم في ن تم مزامنة/تحديث مجموعة الخادم ذات الحجم مع سمة هذا الشخص.

أو

2) حتى يتم مزامنة الخادم "النشط" مع سمة الشخص المحدث. ثم الآخر (N-1) خوادم في المصفوفة متزامنة قدر الإمكان؟

أو

3) طريقة أخرى أنا أكثر من ذلك؟

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

المحلول

الجواب ليس حقًا 1 أو 2. الكائنات مخططة عبر مجموعات مرآة الخادم. في المرة الأولى التي يتم فيها تعيين هذا الحقل ، يتم إنشاء معاملة وسيتم اختيار مجموعة المرآة التي تم اختيارها لتلك المعاملة الأولى "امتلاك" الكائن بعد ذلك.

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

يمكنك العثور على مزيد من المعلومات في وثائق Terracotta حول تكوين مجموعة خادم Terracotta:

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

نصائح أخرى

افترض أن كل شخص آخر لديه إشارة إلى كائنك ويمكنه لمسه أثناء/قبل/بعد ذلك. وبالتالي فإن الحل هو إضافة أقفال ، و

  • الحصول على قفل
  • تعديل الكائن
  • إطلاق قفل

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

نرى:

لست على دراية بتنفيذهم (Terracotta) ، ولكن من وجهة نظر JMM ، إنه ينبغي خذ قفل على مستوى الكتلة. ومع ذلك ، هذا المثال بسيط للغاية ؛ مجرد تغيير في المرجع ، وقد يتسبب ذلك في تحويله إلى شيء يشبه الكتابة المتقلبة ، وتجنب القفل تمامًا.

ولكن ، إذا قمت بعمل أشياء غير تافهة في الكتلة المتزامنة الخاصة بك ، فأفترض أن TC يتشاؤم يأخذ قفلًا على نطاق واسع في بداية الكتلة المتزامنة. إذا لم يفعلوا ، فسيكونون على خلاف مع مواصفات JMM. كما أفهمها.

بمعنى آخر ، الخيار رقم 1. لذا ، كن حذرًا مما تشاركه في الكتلة ، واستخدم الكائنات غير القابلة للتغيير و java.util.concurrent.* هياكل البيانات عندما تتمكن من الحصول على الحب الجوهري الخاص في TC.

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