كيف يعمل التراكوتا في هذا الموقف؟
-
03-07-2019 - |
سؤال
لذلك دعنا نقول لدي ن تم إعداد مجموعة الخادم ذات الحجم مثل 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.