الفرق الدقيق بين notify () و notifyAll ()
في حين أن الفرق الأساسي بين notify () و notifyAll () يكمن في عدد الخيوط المنتظرة التي يتم إيقاظها (واحد مقابل الكل)، وهذا يثير سؤالاً آخر:
لماذا يقوم مؤشر ترابط واحد دائمًا بإعادة الحصول على الكائن lock?
في الحالة العامة، لا يحدد كل من notify() وnotifyAll() أي مؤشر ترابط ينتظر سيتم تحديده لإعادة الحصول على القفل. يقوم JVM أو برنامج جدولة سلاسل رسائل النظام بإجراء هذا التحديد، والذي يمكن أن يكون غير حتمي.
الحاجة إلى notifyAll ()
ومع ذلك، باستخدام notify () في سيناريوهات معينة يمكن أن يؤدي إلى طريق مسدود، كما هو موضح في المثال التالي:
فئة المنتج/المستهلك مع يخطر ()
public class ProducerConsumer { private final int MAX_SIZE = 1; // Buffer size private List
سيناريو حالة الجمود:
الحل: notifyAll()
لحل هذا الجمود، يجب على المرء استخدام notifyAll() بدلاً من notify() في كود المنتج/المستهلك. يضمن ذلك تنشيط جميع سلاسل الرسائل المنتظرة، مما يمنع حدوث حالة توقف تام.توصية:
بالنسبة لمعظم السيناريوهات، فإن notifyAll() هي الطريقة المفضلة لأنها تتجنب حالات التوقف التام المحتملة. إذا كان السيناريو المحدد يتطلب تنبيه مؤشر ترابط انتظار محدد واحد فقط، فيمكن استخدام notify() بحذر.تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3