Locksupport هو مؤشر ترابط أساسي يحظر بدائية يستخدم لإنشاء أقفال وفئات التزامن الأخرى.
تتمثل وظائف Park () و unpark () في Locksupport في حظر الخيوط وإلغاء الحظر ، على التوالي ، و Park () و unpark () لن تواجه مشكلة "deadlocks التي قد تكون ناتجة عن thread.suspend و thread.resume".
لأن Park () و unpark () لها أذونات ؛ ستبقى المنافسة بين الخيط Calling Park () وخيط آخر يحاول Unpark () نشطًا.
الاستخدام الأساسي
يشبه Locksupport إلى حد كبير إشارة ثنائية (يتوفر ترخيص واحد فقط). إذا لم يتم احتلال هذا الترخيص ، فإن الخيط الحالي يحصل على الترخيص ويستمر في التنفيذ ؛ إذا تم احتلال الترخيص ، فإن كتل الخيط الحالية ، في انتظار الحصول على الترخيص.
public static void main (string [] args) {locksupport.park () ؛ System.out.println ("Block.") ؛}سيؤدي تشغيل الكود إلى أن الخيط الرئيسي هو حظر دائمًا. نظرًا لأن الترخيص مشغول افتراضيًا ، فلا يمكن الحصول على الترخيص عند الاتصال بمتنزه () ، لذلك يدخل حالة حظر.
الرمز التالي: إصدار الترخيص أولاً ، ثم الحصول على الترخيص ، ويمكن أن ينتهي الموضوع الرئيسي بشكل طبيعي. إن الاستحواذ وإصدار تراخيص Locksupport مقابلة بشكل عام. إذا قمت بإلغاء القرار عدة مرات ، فلن تكون هناك مشكلة إذا كنت تقف مرة واحدة فقط. نتيجة لذلك ، يكون الترخيص في حالة متاحة.
public static void main (string [] args) {thread thread = thread.currentThRead () ؛ locksupport.unpark (thread) ؛ // refer the locksupport.park () ؛ // الحصول على نظام الترخيص.Locksupport لا يعود إلى. إذا استدعاء مؤشر ترابط Locksupport .park () مرتين على التوالي ، فسيحظر الخيط بالتأكيد.
Public Static Void Main (String [] args) يلقي استثناء {thread = thread.currentThRead () ؛ locksupport.unpark (thread) ؛ System.out.println ("A") ؛ locksupport.park () ؛ System.out.println ("B") ؛ locksupport.park () ؛ System.out.println ("C") ؛}يطبع هذا الرمز A و B ، ولكنه لا يطبع C ، لأن الخيط لا يمكن أن يحصل على إذن عند استدعاء Park في المرة الثانية.
دعونا نلقي نظرة على استجابة المقاطعات المقابلة لـ LockSupport
public static void t2 () يلقي استثناء {thread t = new thread (new runnable () {private int count = 0 ؛ override public void run () {long start = system.currentTimeMIlis () + count) ؛ T.Start () ؛ thread.sleep (2000) ؛ // interrupt thread t.interrupt () ؛ System.out.println ("Main Over") ؛}سيقوم الموضوع بطباعة الموضوع Over.true. هذا يعني أنه إذا تم حظر مؤشرات الترابط بسبب الاتصال بالمنتزه ، فيمكنه الاستجابة لطلب المقاطعة (تم ضبط حالة المقاطعة على TRUE) ، ولكن لن يرمي مقاطعًا.
قائمة وظائف Locksupport
// إرجاع كائن Blocker المقدم إلى أحدث استدعاء طريقة Park غير المحظورة ، ويعيد NULL إذا لم يتم حظر المكالمة. كائن ثابت getBlocker (موضوع T) // لجدولة مؤشرات الترابط ، قم بتعطيل مؤشر الترابط الحالي ما لم يكن الترخيص متاحًا. Static Void Park () // لجدولة مؤشرات الترابط ، قم بتعطيل الخيط الحالي قبل توفر الترخيص. Static Void Park (مانع الكائن) // لجدولة مؤشرات الترابط ، انتظر وقت الانتظار المحدد على الأكثر ما لم يكن الترخيص متاحًا. باطل باطل ثابت (نانو طويل) // لجدولة مؤشرات الترابط ، قم بتعطيل الخيط الحالي قبل أن يتوفر الترخيص وانتظر وقت الانتظار المحدد على الأكثر. باطل باطل ثابت (مانع الكائن ، نانو طويل) // لجدولة مؤشرات الترابط ، يتم تعطيل مؤشر الترابط الحالي قبل الحد الزمني المحدد ما لم يكن الترخيص متاحًا. باطل باطل ثابت (موعد نهائي طويل) // لجدولة مؤشرات الترابط ، يتم تعطيل مؤشر الترابط الحالي قبل الحد الزمني المحدد ما لم يكن الترخيص متاحًا. باركت باطل ثابت (مانع الكائن ، الموعد النهائي الطويل) // اجعله متاحًا إذا لم يكن ترخيص موضوع معين متاحًا بعد. الفراغ الثابت unpark (موضوع مؤشر ترابط)
مثال على قفلات
يمكن أن تمنحك مقارنة "المثال 1" و "المثال 2" أدناه فهمًا أوضح لاستخدام Locksupport.
مثال 1
الفئة العامة waittest1 {public static void main (string [] args) {threada ta = new threada ("ta") ؛ Synchronized (ta) {// احصل على "قفل المزامنة للكائن TA" من خلال Synchronized (TA) حاول {system.out.println (thread.currentThRead (). getName ()+"start ta") ؛ ta.start () ؛ System.out.println (thread.currentThRead (). getName ()+"block") ؛ // الخيط الرئيسي هو في انتظار ta.wait () ؛ System.out.println (thread.currentThRead (). getName ()+"متابعة") ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ }}} static class threada تمتد مؤشر الترابط {public threada (اسم السلسلة) {super (name) ؛ } public void run () {synchronized (this) {// get "قفل المزامنة للكائن الحالي" من خلال system.out.println (thread.currentThRead (). إخطار () ؛ // استيقظ "مؤشر ترابط الانتظار على الكائن الحالي"}}}} مثال 2
استيراد java.util.concurrent.locks.locksupport ؛ فئة عامة locksupporttest1 {private static thread mainthread ؛ public static void main (string [] args) {threada ta = new threada ("ta") ؛ // احصل على مؤشر الترابط الرئيسي mainThRead = thread.currentThRead () ؛ system.out.println (thread.currentThRead (). getName ()+"start ta") ؛ ta.start () ؛ System.out.println (thread.currentThRead (). getName ()+"block") ؛ // كتل مؤشر الترابط الرئيسي locksupport.park (mainthread) ؛ System.out.println (thread.currentThRead (). getName ()+"متابعة") ؛ } static class threada يمتد thread {public threada (اسم السلسلة) {super (name) ؛ } public void run () {system.out.println (thread.currentThread (). getName ()+"wakup others") ؛ // استيقظ "الخيط الرئيسي" locksupport.unpark (mainthread) ؛ }}} نتائج التشغيل:
البداية الرئيسية Tamain Blockta Wakup تستمر الآخرين
الوصف: الفرق بين الحديقة والانتظار. قبل انتظار كتل الخيوط ، يجب الحصول على قفل المزامنة من خلال مزامنة.