يتم تنفيذ REENTRANTLOCK داخليًا بواسطة مثيلات فئة المزامنة.
يتم تعريف فئة المزامنة داخل reentrantlock.
المزامنة وراثة من التجريدي upplyedsynchronizer.
recortedqueuedsynchronizer وراثي من الملخصات synchronizer.
يتم تعريف متغير الحصري فقط في فئة AbstractOwnablesInchronizer ، ويمثل الخيط المملوك حاليًا.
بالإضافة إلى فئة المزامنة ، يحدد REENTRANTLOCK أيضًا فئتين للتنفيذ داخليًا.
nonfairsync هو قفل غير عادل. Fairsync هو قفل عادل.
على ما يلي بنيتين لإعادة إينترانتلوك:
طريقة قفل إعادة إيندرانتلوك
طريقة القفل غير العادلة
طريقة المقارنة هي طريقة CAS. تحاول هذه الطريقة تحديث متغير في الكائن. يتوقع المتغير أن يكون 0 ، محدث إلى 1.
إذا كان التحديث ناجحًا ، فقم بتعيين متغير ExclusoLoWnerThread على مؤشر الترابط الحالي. ثم ستعود طريقة القفل على الفور.
إذا فشل التحديث ، يتم استدعاء (1).
في طريقة اكتساب ، تسمى TryAcquire () أولاً ومحاولة التحديث مرة أخرى.
طريقة TryAcquire () للقفل غير العادل هي كما يلي:
تسمى طريقة غير العادلة من القفل غير العادل داخليًا بواسطة طريقة غير المجالات على النحو التالي:
إذا تمت تجربة طريقة TryAcquire () مرة أخرى دون نجاح. أولاً ، سيتم استدعاء طريقة AddWaiter () لإضافة مؤشر الترابط الحالي إلى قائمة انتظار الانتظار. تقوم طريقة AddWaiter بإرجاع عقدة العقدة.
بعد العودة إلى العقدة ، سيحاول الحصول على (العقدة ، 1) التحديث مرة أخرى.
إذا كان لا يمكن تحديث التحديث ، فسيتم تعليق الخيط من خلال ParkandCheckInterrupt.
طريقة reentrantlock فتح
تحقق من طريقة الإصدار ().
إذا لم يكن رأس قائمة الانتظار فارغًا ولم تكن حالة انتظار الرأس 0 ، فسيتم استدعاء طريقة Unparksuccessor ().
طريقة Unparksuccessor () هي كما يلي:
اجعل مرور العقدة من الخلف إلى الأمام للحصول على الخيط الأول في قائمة الانتظار مع WaitStatus أقل من 0. ثم تابع الخيط على العقدة.