لنلقي نظرة على هذا الرمز:
استيراد java.util.bitset ؛ Thread T1 = New Thread (new RunNable () {public void run () {try {latch.await () ؛ thread.sleep (1000) ؛} catch (استثناء ex) {} bs.set (1) ؛}) ؛ Thread T2 = New Thread (New RunNable () {public void run () {try {latch.await () ؛ thread.sleep (1000) ؛} catch (استثناء e) {} bs.set (2) ؛}}) ؛ start () ؛ :}}والسؤال هو ، ما هي نتيجة إخراج الرمز هذا؟ ما هي النتائج التي يمكن أن تنتجها؟
دعونا نلقي نظرة على ما يفعله هذا البرنامج:
بعد ذلك ، نحتاج إلى بناء بعض حالات الاختبار للتحقق من هذه السلوكيات. من الواضح أن أحدهم يمكنه تشغيل هذا المثال فقط ، ثم مراقبة النتائج والإجابة على الأسئلة أعلاه.
يمكن أن تجعل الحذر صدفة
لحسن الحظ ، يمكننا استخدام الأدوات. JCSTRETS هي أداة اختبار لحل مثل هذه المشكلات.
يمكننا بسهولة كتابة حالة الاختبار الخاصة بنا كشكل يمكن لـ JCSTRESS التعرف عليه. في الواقع ، لقد أعد مجموعة متنوعة من الواجهات بالنسبة لنا. نحن بحاجة إلى مثال.
نستخدم ACTOR2_ARBITER1_TEEST <bitset ، واجهة BooleAnsult2 نحتاج إلى العثور على Java 8 JVM لتشغيله ، ولكن الآن هذه ليست مشكلة.
انظر إلى التنفيذ أدناه.
الطبقة العامة anexampletest تنفذ ACTOR2_ARBITER1_TEST <bitset ، booleanresult2> {Override public void Actor1 (bitset s ، booleanresult2 r) {s.set (1) ؛} override public void Actor2 (bitset s ، booleanresult2 r) {s.set (2) )) ؛} Override Public Boolenrsult2 NewResult () {return New BooleAnresult2 () ؛}}
الآن عند تشغيل هذا الاختبار ، ستجرب التحكم جميع أنواع الحيل للحصول على جميع المجموعات الممكنة من العوامل التي تدفع هذه الإجراءات: متوازية أو غير مميتة ، لا يوجد اكتشاف للحمل ، وهناك عدة مرات في سطر واحد ، عدة مرات ، في كثير من الأحيان ، عدة مرات ، في كثير من الأحيان ، سيتم تسجيل جميع النتائج الممكنة.
عندما تريد أن تعرف كيف يكون رمزك المتوازي ، فهذه طريقة أفضل لحفر فكر جوفاء والتفكير في كل التفاصيل من نفسك.
بالإضافة إلى ذلك ، من أجل استخدام الراحة الشاملة التي جلبتها قيود JCSTRess ، نحتاج إلى تزويدها بتفسير للنتائج المحتملة.
<name test = "org.openjdk.jcstress.tests.custom.anexampletest"> <ساهمت في الحصول على أوليغ شيلاجيف </ساهمت في أوصاف إذا كانت Bitset تعمل بشكل جيد مع مزامنة > match> [true ، true] </sicks> <create> مقبول </توقع> <الوصف> رؤية جميع التحديثات سليمة. /توقع> كتابة T2 T1 > </case> <nmatched> <توقع> محظور </exten> <الوصف> جميع الحالات الأخرى تحت غير متوقعة.
الآن ، نحن على استعداد لهذا الوحش لبدء هدير.
java -xx:+inlockDiagnosticVmoptions -xx:+whiteboxapi -xx: -resterictcontended -jar tests -custot/target/jcstress.jar -t = ".*anexampletest"
النتيجة التي نحصل عليها هي تقرير أنيق.
من الواضح أنه لا يمكننا الحصول على النتائج المتوقعة فحسب ، أي أن كلا الموضوعين قد وضعوا مواقعهما ، ولكن أيضًا يواجهون حالة تنافسية ، وسيغطي مؤشر ترابط نتيجة مؤشر ترابط آخر.
حتى لو رأيت شيئًا من هذا القبيل ، يجب أن يكون لديك عقلية هادئة لـ "The Mountain People لها حيلهم الخاصة" ، أليس كذلك؟
بالمناسبة ، إذا كنت تفكر في كيفية تعديل هذا الرمز ، فإن الإجابة هي قراءة فئة bitset بعناية في Javadoc وإدراك أنها ليست أمان مؤشر ترابط وتتطلب تزامنًا خارجيًا. يمكن تحقيق ذلك بسهولة عن طريق زيادة قيم الإعداد للكتل المتزامنة.
متزامن (BS) {bs.set (1) ؛}