يعد الجمود في Java جزءًا من تعدد العمليات. يمكن أن يحدث حالة توقف تام في موقف ينتظر فيه مؤشر الترابط قفل الكائن، الذي يتم الحصول عليه بواسطة مؤشر ترابط آخر وينتظر الخيط الثاني قفل الكائن الذي يتم الحصول عليه بواسطة مؤشر الترابط الأول. نظرًا لأن كلا الخيطين ينتظران بعضهما البعض لتحرير القفل، فإن الحالة تسمى حالة توقف تام.
مثال على حالة الجمود في جافا
TestDeadlockExample1.java
public class TestDeadlockExample1 { public static void main(String[] args) { final String resource1 = 'ratan jaiswal'; final String resource2 = 'vimal jaiswal'; // t1 tries to lock resource1 then resource2 Thread t1 = new Thread() { public void run() { synchronized (resource1) { System.out.println('Thread 1: locked resource 1'); try { Thread.sleep(100);} catch (Exception e) {} synchronized (resource2) { System.out.println('Thread 1: locked resource 2'); } } } }; // t2 tries to lock resource2 then resource1 Thread t2 = new Thread() { public void run() { synchronized (resource2) { System.out.println('Thread 2: locked resource 2'); try { Thread.sleep(100);} catch (Exception e) {} synchronized (resource1) { System.out.println('Thread 2: locked resource 1'); } } } }; t1.start(); t2.start(); } }
انتاج:
Thread 1: locked resource 1 Thread 2: locked resource 2
المزيد من المآزق المعقدة
قد يتضمن حالة توقف تام أيضًا أكثر من خيطين. والسبب هو أنه قد يكون من الصعب اكتشاف حالة الجمود. فيما يلي مثال حيث وصلت أربعة سلاسل إلى طريق مسدود:
الخيط 1 يقفل A، وينتظر B
قفل الخيط 2 B، ينتظر C
الخيط 3 يقفل C، وينتظر D
الخيط 4 يقفل D، وينتظر A
الخيط 1 ينتظر الخيط 2، الخيط 2 ينتظر الخيط 3، الخيط 3 ينتظر الخيط 4، والخيط 4 ينتظر الخيط 1.
كيفية تجنب الجمود؟
الحل للمشكلة موجود في جذورها. في حالة الجمود، يكون نمط الوصول إلى الموارد A وB، هو المشكلة الرئيسية. لحل المشكلة، سيتعين علينا ببساطة إعادة ترتيب البيانات حيث يصل الكود إلى الموارد المشتركة.
DeadlockSolved.java
public class DeadlockSolved { public static void main(String ar[]) { DeadlockSolved test = new DeadlockSolved(); final resource1 a = test.new resource1(); final resource2 b = test.new resource2(); // Thread-1 Runnable b1 = new Runnable() { public void run() { synchronized (b) { try { /* Adding delay so that both threads can start trying to lock resources */ Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } // Thread-1 have resource1 but need resource2 also synchronized (a) { System.out.println('In block 1'); } } } }; // Thread-2 Runnable b2 = new Runnable() { public void run() { synchronized (b) { // Thread-2 have resource2 but need resource1 also synchronized (a) { System.out.println('In block 2'); } } } }; new Thread(b1).start(); new Thread(b2).start(); } // resource1 private class resource1 { private int i = 10; public int getI() { return i; } public void setI(int i) { this.i = i; } } // resource2 private class resource2 { private int i = 20; public int getI() { return i; } public void setI(int i) { this.i = i; } } }
انتاج:
In block 1 In block 2
في الكود أعلاه، تحل فئة DeadlockSolved حالة الجمود. وسوف يساعد في تجنب المآزق، وإذا واجهتها، في حلها.
كيفية تجنب حالة الجمود في جافا؟
لا يمكن حل حالات الجمود بشكل كامل. لكن يمكننا تجنبها باتباع القواعد الأساسية المذكورة أدناه: