سؤال

وأنا أتساءل ما طرق جيدة سيكون هناك تقديم تأكيدات حول المزامنة أو شيء كي أتمكن من كشف انتهاكات التزامن (في حين اختبار).

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

وأنا التوق شيئا من هذا القبيل يمكن أن يتم عن AWT موضوع إيفاد بما يلي:

public static void checkDispatchThread() {
    if(!SwingUtilities.isEventDispatchThread()) {
        throw new RuntimeException("GUI change made outside AWT dispatch thread");
    }
}

وكنت أريد فقط شيء أكثر عمومية. وصف المشكلة ليست واضحة جدا ولكن آمل أن أحدا لديه بعض مناهج جيدة =)

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

المحلول

أنت تبحث عن الكأس المقدسة، على ما أعتقد. AFAIK لم يكن موجودا، وجافا ليست لغة يسمح هذا النهج إلى أن تنشأ بسهولة.

و"جافا التزامن في ممارسة" لديها قسم التجارب لمشاكل خيوط. ويلفت اهتمام خاص لمدى صعوبة هو أن تفعل.

نصائح أخرى

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

وهنا هو حول كيفية استخدامها.

فكرة IntelliJ لديها الكثير من التزامن مفيدا <لأ href = "HTTP: //www.jetbrains.com/idea/documentation/inspections.jsp "يختلط =" نوفولو noreferrer "> عمليات التفتيش . على سبيل المثال، فإنه يحذرك عند الوصول إلى نفس الكائن من كلا السياقين متزامنة وunsynchronised، عند مزامنة على الكائنات غير النهائية وأكثر من ذلك.

وعلى نحو مماثل، FindBugs ديها العديد من يشبه <لأ href = "http://findbugs.sourceforge.net /bugDescriptions.html "يختلط =" نوفولو noreferrer "> الشيكات .

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

والشيء الوحيد الذي يفعل جافا داخليا هو أن فئة مجموعة يحتفظ عدد من كم مرة تم تحديثه. ثم يغادر مكرر التي تقدر على كل .next () ضد ما كان عليه عندما تم إنشاء interator لمعرفة ما إذا تم تحديث مجموعة بينما كنت بالتكرار. وأعتقد أن هذا المبدأ يمكن أن تستخدم بشكل عام.

مسابقة أو <وأ href = "HTTP : //www.coverity.com/html/coverity-thread-analyzer-java.html "يختلط =" نوفولو noreferrer "> Covertity

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

وأيضا، تحقق هذا السؤال: اختبار تطبيق مؤشرات

وكنت قد تكون مهتمة في هذا النهج بيتر Veentjer كتبت عن الذي يسميه <لأ href = "http://pveentjer.wordpress.com/2008/05/26/the-concurrency-detector/" يختلط = "نوفولو noreferrer "> الكاشف التزامن . لا أعتقد أنه المصدر المفتوح هذا بعد، لكن لأنه يصف ذلك فإن الفكرة الأساسية هي استخدام اوب إلى رمز الأداة التي كنت مهتما في التنميط، وسجل وموضوع وقد لمست التي المجال. بعد ذلك انها مسألة يدويا أو تلقائيا تحليل سجلات تم إنشاؤها.

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

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

class Foo {

  private final Thread owner = Thread.currentThread();

  void x() {
    assert Thread.currentThread() == owner;
    /* Implement method. */
  }

}

والإشارة مالك ما زال يسكنها حتى عندما يتم تعطيل التأكيدات، حتى انها ليست تماما "حرة". وأود أيضا لا تريد أن تحدث فوضى في العديد من دروسي مع هذا النمطي.

في Thread.holdsLock (كائن) قد تكون الأسلوب أيضا مفيدا لك.

لالمثال المحددة التي تعطي، SwingLabs ديه بعض التعليمات البرمجية المساعد للكشف عن انتهاكات موضوع الحدث وتوقف. https://swinghelper.dev.java.net/

وحين يعود، لقد عملت مع أدوات التنميط JProbe جافا. بدا واحد من أدواتهم (threadalyzer؟) للانتهاكات موضوع متزامنة. وعند النظر إلى صفحة الويب الخاصة بهم، وأنا لا أرى أداة بهذا الاسم أو تماما ما أتذكر. ولكنك قد ترغب في إلقاء نظرة. http://www.quest.com/jprobe/performance-home.aspx

ويمكنك استخدام netbeans المحلل أو <وأ href = "http://java.sun.com /developer/technicalArticles/J2SE/jconsole.html "يختلط =" نوفولو noreferrer "> JConsole للتحقق من حالة المواضيع في عمق

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