في مؤشرات (جافا أو .صافي) برنامج هل يمكن أن أفترض أن نسخ متغير الذرية?

StackOverflow https://stackoverflow.com/questions/473111

سؤال

كنت قلقا حول شروط السباق في تطبيق أنا أصمم عندما كنت أتساءل عن هذا السؤال.

دعونا نقول لدي مجموعة كبيرة أو مجموعة من نوع التي يتم إدارتها من قبل مكون واحد من برنامج دعونا ندعو أن عنصر مراقبة.وظيفتها هي أن تحقق بانتظام إذا جمع "القذرة" ، هـ.قد تغيرت في الآونة الأخيرة, و أنا أكتب لقطة إلى القرص (هذا هو الحاجز التطبيق في حالة وقوع الحادث) وعلامة على أنها نظيفة مرة أخرى.

مكونات أخرى من نفس البرنامج يعمل في ترابط مختلفة استدعاء مراقب طرق لإضافة البيانات إلى أو تعديل البيانات في مجموعة/مجموعة.تلك الأساليب علامة جمع القذرة.

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

لوهلة ظننت أنني ربما حل المشكلة عن طريق تقديم نسخة مؤقتة من جمع علامة نظيفة ثم اذهب و تسلسل نسخ.لكن هل النسخ تكون الذرية ، هـ.يمكنني التأكد من أن المجموعة لن تتغير بينما أنا نسخ ذلك ؟

وفي الوقت نفسه, أعتقد أنني قد وجدت أفضل الحلول مثل

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

وأعتقد قفل العلم قد يكون أفضل طريقة للذهاب. ولكن أنا لا تزال غريبة:يتم نسخ متغير الذرية?


متابعة:ربما هذا يجب أن تذهب في سؤال من تلقاء نفسها ، لكنه في الواقع نفسه كثيرا.وفقا الإجابات أدناه ، "العلم قفل" النهج قد لا تعمل أيضا ، أليس كذلك ؟ لأن البيانات تغيير الأسلوب قد تحقق العلم قفل بينما يتم تعيين إلى "مؤمن" قيمة تقرر أنه غير مؤمن.لذلك أنا بحاجة إلى البناء الخاصة مثل مزامنة إذا كنت تريد حقا أن تفعل هذا صحيح, صحيح ؟


مجد إريكسون له مفيدة جدا الجواب على المتابعة.أنا حقا يجب أن اثنين من هذه الأسئلة حتى أتمكن من قبول اثنين من الإجابات.يرجى التصويت له أيضا.

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

المحلول

لا.على سبيل المثال, طويلة المتغيرات في جافا لا الذري على 32 بت الآلات.

بالإضافة إلى ذلك هناك "ترابط التخزين المؤقت" المسألة - إلا إذا متغيرة متقلبة أو داخل متزامنة كتلة موضوع آخر قد لا ترى تغيير قيمة المتغير.وهذا ينطبق على جميع أنواع من المتغيرات ، ليس فقط طويلة.

اقرأ هنا: http://gee.cs.oswego.edu/dl/cpj/jmm.html, خصوصا "atomicity" و "الرؤية" الفقرات.

نصائح أخرى

لا, ليس الذرية. ترى هذا السؤال لماذا وماذا تفعل حيال ذلك.

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

تحتاج إلى أن تشعر بالقلق إزاء رؤية تغييرات على المواضيع الأخرى عند العمل على JVM.بشكل عام, يجب عليك ان تجعل المهام الخاصة بك في غضون synchronized كتلة ، أو المتغير يجب أن يكون volatile, أو يجب استخدام متغير المجمع من java.util.concurrent.atomic الحزمة.

ومع ذلك, في حال, يبدو أن لديك فقط موضوع واحد من أي وقت مضى مسح "القذرة" العلم الخيط الذي استمرت البيانات.إذا كان هذا هو الحال, واضحة العلم قبل كتابة البيانات.إذا غيرها من المواضيع تعيين في حين كتابة البيانات, وسوف تبقى مجموعة المجدول التالي الكتابة.أود أن استخدام AtomicBoolean, اعطاء استمرار الموضوع atomicity بين التحقق من العلم وتطهير مثل هذا:

private final AtomicBoolean dirty = new AtomicBoolean();

/**
 * Any method that modifies the data structure should set the dirty flag.
 */
public void modify() {
  /* Modify the data first. */
  ...
  /* Set the flag afterward. */
  dirty.set(true);
}

private class Persister extends Thread {
  public void run() {
    while (!Thread.interrupted()) {
      if (dirty.getAndSet(false)) {
        /* The dirty flag was set; this thread cleared it 
         * and should now persist the data. */
         ...
      }
    }
  }
}

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

انظر أيضا: هو الوصول إلى متغير في C# ذرية العملية ؟

يعتمد كثيرا على الأجهزة JVM تشغيل

على بعض الأجهزة وبعض JVMs بعض النسخ سوف تكون الذرية لكنه أكثر أمانا أن نفترض أن هذا ليس هو الحال حتى بسيطة عدد صحيح على عدد صحيح الاحالة يمكن أن تترجم إلى أربعة تعليمات الجهاز على x856 الأجهزة.

سلسلة مجموعة النسخ يمكن أن تنطوي على سلسلة من الآلاف من تعليمات وأنه من الممكن لشخصين المواضيع لتحديث simultaniously.

كما فهمت ليس دائما.

Int32 سوف يكون ، Int64 لن يكون على 32 بت sytem كما أنه يحتاج 2 × 32 بت.ولذلك فإنه لا يصلح في واحدة من 32 بت الخلية.

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