logo

Застој у Јави

Застој у Јави је део вишенитног рада. Застој се може десити у ситуацији када нит чека на закључавање објекта, које је преузела друга нит, а друга нит чека на закључавање објекта које је преузела прва нит. Пошто обе нити чекају једна другу да отпусте закључавање, услов се назива застој.

Застој у Јави

Пример застоја у Јави

ТестДеадлоцкЕкампле1.јава

 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 закључава А, чека Б

Навој 2 закључава Б, чека Ц

Навој 3 закључава Ц, чека Д

Навој 4 закључава Д, чека А

Нит 1 чека нит 2, нит 2 чека нит 3, нит 3 чека нит 4, а нит 4 чека нит 1.

Како избећи застој?

Решење за проблем се налази у његовим коренима. У ћорсокаку, то је образац приступа ресурсима А и Б, главно питање. Да бисмо решили проблем, мораћемо једноставно да променимо редослед изјава у којима код приступа заједничким ресурсима.

ДеадлоцкСолвед.јава

 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 

У горњем коду, класа ДеадлоцкСолвед решава ситуацију застоја. То ће помоћи у избегавању застоја, а ако се наиђе, у њиховом решавању.

Како избећи застој у Јави?

Застоји се не могу у потпуности решити. Али можемо их избјећи слиједећи основна правила наведена у наставку:

    Избегавајте угнежђене браве: Морамо избегавати да закључавамо више нити, ово је главни разлог за застој. Обично се дешава када дате закључавање више нити.Избегавајте непотребне браве: Браве треба дати важним нитима. Давање закључавања непотребним нитима које изазивају стање застоја.Коришћење Тхреад Јоин-а: Застој се обично дешава када једна нит чека да се заврши друга. У овом случају можемо користити придружити са максималним временом које ће нит трајати.