- Trending Categories
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
Physics
Chemistry
Biology
Mathematics
English
Economics
Psychology
Social Studies
Fashion Studies
Legal Studies
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
How can we avoid a deadlock in Java?
In Java, a deadlock is a programming situation where two or more threads are blocked forever. A deadlock condition will occur with at least two threads and two or more resources.
How To Avoid Deadlock
Avoid Nested Locks − A deadlock mainly happens when we give locks to multiple threads. Avoid giving a lock to multiple threads if we already have given to one.
Avoid Unnecessary Locks − We can have a lock only those members which are required. Having a lock unnecessarily can lead to a deadlock.
Using Thread.join() − A deadlock condition appears when one thread is waiting other to finish. If this condition occurs we can use Thread.join() with the maximum time the execution will take.
Example
public class DeadlockTest { public static void main(String[] args) throws InterruptedException { Object obj1 = new Object(); Object obj2 = new Object(); Object obj3 = new Object(); Thread t1 = new Thread(new SyncThread(obj1, obj2), "t1"); Thread t2 = new Thread(new SyncThread(obj2, obj3), "t2"); t1.start(); Thread.sleep(2000); t2.start(); Thread.sleep(2000); } } class SyncThread implements Runnable { private Object obj1; private Object obj2; public SyncThread(Object o1, Object o2){ this.obj1=o1; this.obj2=o2; } @Override public void run() { String name = Thread.currentThread().getName(); System.out.println(name + " acquiring lock on " + obj1); synchronized (obj1) { System.out.println(name + " acquired lock on " + obj1); work(); } System.out.println(name + " released lock on " + obj1); System.out.println(name + " acquiring lock on " + obj2); synchronized (obj2) { System.out.println(name + " acquired lock on " + obj2); work(); } System.out.println(name + " released lock on " + obj2); System.out.println(name + " finished execution."); } private void work() { try { Thread.sleep(5000); } catch (InterruptedException ie) { ie.printStackTrace(); } } }
Output
t1 acquiring lock on java.lang.Object@27a54c50 t1 acquired lock on java.lang.Object@27a54c50 t2 acquiring lock on java.lang.Object@2ee6a5aa t2 acquired lock on java.lang.Object@2ee6a5aa t1 released lock on java.lang.Object@27a54c50 t1 acquiring lock on java.lang.Object@2ee6a5aa t2 released lock on java.lang.Object@2ee6a5aa t2 acquiring lock on java.lang.Object@20214e06 t1 acquired lock on java.lang.Object@2ee6a5aa t2 acquired lock on java.lang.Object@20214e06 t1 released lock on java.lang.Object@2ee6a5aa t2 released lock on java.lang.Object@20214e06 t1 finished execution. t2 finished execution.
Advertisements