logo

Zastoj u Javi

Zastoj u Javi je dio višenitnosti. Zastoj se može dogoditi u situaciji kada nit čeka na zaključavanje objekta, koje je stekla druga nit, a druga nit čeka na zaključavanje objekta koje je stekla prva nit. Budući da obje niti čekaju jedna drugu da otključaju, stanje se naziva zastoj.

Zastoj u Javi

Primjer zastoja u Javi

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(); } } 

Izlaz:

 Thread 1: locked resource 1 Thread 2: locked resource 2 

Složeniji zastoji

Zastoj također može uključivati ​​više od dvije niti. Razlog je taj što može biti teško otkriti zastoj. Evo primjera u kojem su četiri niti došle u zastoj:

Nit 1 zaključava A, čeka B

Uvucite 2 pramena B, čekate C

Uvucite 3 pramena C, čekate D

Nit 4 brave D, čeka A

Nit 1 čeka nit 2, nit 2 čeka nit 3, nit 3 čeka nit 4, a nit 4 čeka nit 1.

Kako izbjeći zastoj?

Rješenje problema nalazi se u njegovom korijenu. U zastoju glavni problem je obrazac pristupa resursima A i B. Kako bismo riješili problem, morat ćemo jednostavno promijeniti redoslijed izjava u kojima kod pristupa zajedničkim resursima.

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; } } } 

Izlaz:

 In block 1 In block 2 

U gornjem kodu, klasa DeadlockSolved rješava situaciju zastoja. Pomoći će u izbjegavanju zastoja i, ako do njega dođe, u njegovom rješavanju.

Kako izbjeći zastoj u Javi?

Zastoji se ne mogu potpuno riješiti. Ali možemo ih izbjeći slijedeći osnovna pravila navedena u nastavku:

    Izbjegavajte ugniježđene brave: Moramo izbjegavati zaključavanje višestrukih niti, to je glavni razlog stanja zastoja. To se obično događa kada date zaključavanje više niti.Izbjegavajte nepotrebna zaključavanja: Brave treba dati važnim nitima. Zaključavanje nepotrebnih niti koje uzrokuju stanje zastoja.Korištenje spajanja niti: Zastoj se obično događa kada jedna nit čeka da druga završi. U ovom slučaju, možemo koristiti pridružiti s maksimalnim vremenom koje će nit trebati.