Deadlock:
When n threads are in waiting state in such a way that thread1 is waiting for some resource which is held by thread2 and thread2 is waiting for some resource held by thread3 and so on thread n is waiting for some resources held by thread1, this situation when all threads are in waiting state and no thread release the lock because it is also in waiting state is known as deadlock.
Diagram:
Example:
DeadLockExample.java
/** * This program is used to show deadlock situation in multithreading. * @author w3schools */ public class DeadLockExample { public static void main(String[] args) { final String resource1 = "Amani"; final String resource2 = "Nidhi"; final String resource3 = "Prabhjot"; Thread thread1 = new Thread() { public void run() { //thread1 tries to lock on resource1. synchronized (resource1) { System.out.println("Thread1 locked resource1: " + resource1); try { Thread.sleep(500); } catch (Exception e) { System.out.println(e); } //thread1 tries to lock on resource2. synchronized (resource2) { System.out.println("Thread2 locked resource2: " + resource2); } //thread1 tries to lock on resource3. synchronized (resource2) { System.out.println("Thread2 locked resource3: " + resource3); } } } }; Thread thread2 = new Thread() { public void run() { //thread1 tries to lock on resource2. synchronized (resource2) { System.out.println("Thread1 locked resource2: " + resource2); try { Thread.sleep(500); } catch (Exception e) { System.out.println(e); } //thread1 tries to lock on resource1. synchronized (resource1) { System.out.println("Thread2 locked resource1: " + resource1); } //thread1 tries to lock on resource3. synchronized (resource3) { System.out.println("Thread2 locked resource3: " + resource3); } } } }; Thread thread3 = new Thread() { public void run() { //thread1 tries to lock on resource3. synchronized (resource3) { System.out.println("Thread1 locked resource3: " + resource3); try { Thread.sleep(500); } catch (Exception e) { System.out.println(e); } //thread1 tries to lock on resource1. synchronized (resource1) { System.out.println("Thread2 locked resource1: " + resource1); } //thread1 tries to lock on resource2. synchronized (resource2) { System.out.println("Thread2 locked resource2: " + resource2); } } } }; //start threads. thread1.start(); thread2.start(); thread3.start(); } } |
Output:
Thread1 locked resource3: Prabhjot Thread1 locked resource2: Nidhi Thread1 locked resource1: Amani |
Download this example.
Next Topic: Starvation in java with example.
Previous Topic: Difference between Thread.yield() and Thread.sleep() methods.