logo

Aklavietė Java

„Java“ aklavietė yra kelių gijų dalis. Aklavietė gali įvykti situacijoje, kai gija laukia objekto užrakto, kurį įgyja kita gija, o antra gija laukia objekto užrakto, kurį įgyja pirmoji gija. Kadangi abi gijos laukia, kol viena kita atleis užraktą, sąlyga vadinama aklaviete.

Aklavietė Java

„Java“ aklavietės pavyzdys

TestDeadlockExample1.java

10 iš 1 mln
 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(); } } 

Išvestis:

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

Sudėtingesnės aklavietės

Aklavietėje taip pat gali būti daugiau nei dvi gijos. Priežastis ta, kad gali būti sunku aptikti aklavietę. Štai pavyzdys, kai keturios gijos aklavietėje:

1 siūlas užfiksuoja A, laukia B

nulinio taško išimtis

Užsukite 2 užraktus B, laukiate C

Siūlai 3 užrakina C, laukia D

Siūlai 4 spynos D, laukia A

1 sriegis laukia 2 sriegio, 2 sriegis laukia 3 sriegio, 3 sriegis laukia 4 sriegio, o 4 sriegis laukia 1 sriegio.

cinamonas vs mate

Kaip išvengti aklavietės?

Problemos sprendimas randamas jos šaknyse. Aklavietėje pagrindinė problema yra prieigos prie A ir B išteklių modelis. Norėdami išspręsti problemą, turėsime tiesiog iš naujo išdėstyti teiginius, kuriuose kodas pasiekia bendrinamus išteklius.

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

Išvestis:

 In block 1 In block 2 

Aukščiau pateiktame kode klasė DeadlockSolved išsprendžia aklavietės tipo situaciją. Tai padės išvengti aklavietės, o iškilus – jas išspręsti.

Kaip išvengti aklavietės „Java“?

Aklavietės negali būti visiškai pašalintos. Bet mes galime jų išvengti, laikydamiesi pagrindinių toliau nurodytų taisyklių:

    Venkite įdėtų spynų: Turime vengti užrakinti kelias gijas, nes tai yra pagrindinė aklavietės būklės priežastis. Paprastai tai atsitinka, kai užrakinate kelias gijas.Venkite nereikalingų spynų: Spynos turėtų būti skiriamos svarbiems siūlams. Užrakinti nereikalingas gijas, kurios sukelia aklavietės būseną.Naudojant gijų sujungimą: Aklavietė dažniausiai atsitinka, kai viena gija laukia, kol baigsis kita. Tokiu atveju galime naudoti prisijungti su maksimaliu laiku, kurį užtruks siūlas.