Though, I made few mistakes on that useless online IDE but mostly code was correct & idea was completely correct. Below is the working which has my 90% solution I gave during interview.
public class CDKSample2 {
public static void main(String[] args) throws InterruptedException {
Resource1 resource1 = new Resource1();
Resource2 resource2 = new Resource2();
Thread t1 = new Thread(new Deadlock(resource1, resource2, 1));
Thread t2 = new Thread(new Deadlock(resource1, resource2, 2));
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("Completed....");
}
static class Deadlock implements Runnable {
int order;
Resource1 resource1;
Resource2 resource2;
public Deadlock(Resource1 resource1, Resource2 resource2, int order) {
this.order = order;
this.resource1 = resource1;
this.resource2 = resource2;
resource1.setResource2(resource2);
resource2.setResource1(resource1);
}
@Override
public void run() {
if(order == 1) {
resource1.getResource();
} else if(order == 2) {
resource2.getResource();
}
}
}
static class Resource1 {
Resource2 resource2 = null;
public Resource1() {
}
public void setResource2(Resource2 resource2) {
this.resource2 = resource2;
}
public synchronized void getResource() {
System.out.println("Resource1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
resource2.getResource();
}
}
static class Resource2 {
Resource1 resource1 = null;
public Resource2() {
}
public void setResource1(Resource1 resource1) {
this.resource1 = resource1;
}
public synchronized void getResource() {
System.out.println("Resource2");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
resource1.getResource();
}
}
}