Deadlock v Jave je súčasťou multithreadingu. Uviaznutie môže nastať v situácii, keď vlákno čaká na uzamknutie objektu, ktoré získa iné vlákno, a druhé vlákno čaká na uzamknutie objektu, ktoré získa prvé vlákno. Keďže obe vlákna na seba čakajú na uvoľnenie zámku, stav sa nazýva zablokovanie.
Príklad Deadlock v Jave
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(); } }
Výkon:
Thread 1: locked resource 1 Thread 2: locked resource 2
Komplikovanejšie uviaznutia
Uviaznutie môže zahŕňať aj viac ako dve vlákna. Dôvodom je, že môže byť ťažké odhaliť uviaznutie. Tu je príklad, v ktorom uviazli štyri vlákna:
konektivita java
Závit 1 uzamkne A, čaká na B
Závit 2 zámky B, čaká na C
Závit 3 zámkov C, čaká na D
Navlečte 4 zámky D, čaká na A
Vlákno 1 čaká na vlákno 2, vlákno 2 čaká na vlákno 3, vlákno 3 čaká na vlákno 4 a vlákno 4 čaká na vlákno 1.
Ako sa vyhnúť zablokovaniu?
Riešenie problému sa nachádza v jeho koreňoch. V mŕtvom bode je hlavným problémom vzor prístupu k zdrojom A a B. Na vyriešenie problému budeme musieť jednoducho preusporiadať príkazy, kde kód pristupuje k zdieľaným zdrojom.
zlúčiť triedenie v jave
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; } } }
Výkon:
In block 1 In block 2
Vo vyššie uvedenom kóde trieda DeadlockSolved rieši situáciu zablokovania. Pomôže vám to vyhnúť sa zablokovaniu a ak sa stretnete, aj ich vyriešiť.
Ako sa vyhnúť zablokovaniu v Jave?
Uviaznutie sa nedá úplne vyriešiť. Môžeme sa im však vyhnúť dodržiavaním základných pravidiel uvedených nižšie: