logo

Dødlås i Java

Deadlock i Java er en del av multithreading. Deadlock kan oppstå i en situasjon når en tråd venter på en objektlås, som er anskaffet av en annen tråd og andre tråd venter på en objektlås som er anskaffet av den første tråden. Siden begge trådene venter på at hverandre skal frigjøre låsen, kalles tilstanden deadlock.

Dødlås i Java

Eksempel på Deadlock i 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(); } } 

Produksjon:

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

Mer kompliserte vranglåser

En deadlock kan også inneholde mer enn to tråder. Årsaken er at det kan være vanskelig å oppdage en vranglås. Her er et eksempel der fire tråder har låst seg:

Tråd 1 låser A, venter på B

Gjenge 2 låser B, venter på C

Gjenge 3 låser C, venter på D

Tråd 4 låser D, venter på A

Tråd 1 venter på tråd 2, tråd 2 venter på tråd 3, tråd 3 venter på tråd 4, og tråd 4 venter på tråd 1.

Hvordan unngå vranglås?

En løsning på et problem er funnet ved røttene. I vranglås er det mønsteret for tilgang til ressursene A og B, som er hovedproblemet. For å løse problemet må vi ganske enkelt omorganisere setningene der koden har tilgang til delte ressurser.

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

Produksjon:

 In block 1 In block 2 

I koden ovenfor løser klassen DeadlockSolved den deadlock typen situasjon. Det vil bidra til å unngå fastlåste situasjoner, og hvis de oppstår, løse dem.

Hvordan unngå deadlock i Java?

Våninger kan ikke løses helt. Men vi kan unngå dem ved å følge grunnleggende regler nevnt nedenfor:

    Unngå nestede låser: Vi må unngå å gi låser til flere tråder, dette er hovedårsaken til en fastlåst tilstand. Det skjer vanligvis når du gir låser til flere tråder.Unngå unødvendige låser: Låsene skal gis til de viktige trådene. Å gi låser til de unødvendige trådene som forårsaker dødlåstilstanden.Bruke Thread Join: En vranglås oppstår vanligvis når den ene tråden venter på at den andre skal fullføres. I dette tilfellet kan vi bruke bli med med maksimal tid som en tråd vil ta.