I got this deadlock sample codes from oracle.
class Thread_Test {
static class Friend {
private final String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void bow(Friend bower) {
System.out.format("%s: %s" + " has bowed to me!%n", this.name, bower.getName());
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
System.out.format("%s: %s" + " has bowed back to me!%n", this.name, bower.getName());
}
}
public static void main(String[] args) {
final Friend alphonse = new Friend("Alphonse");
final Friend gaston = new Friend("Gaston");
new Thread(new Runnable() {
public void run() { alphonse.bow(gaston); }
}).start();
new Thread(new Runnable() {
public void run() { gaston.bow(alphonse); }
}).start();
}
}
If I change function bow like below, I can resolve the deadlock issue.
public void bow(Friend bower) {
synchronized(this) {
System.out.format("%s: %s" + " has bowed to me!%n", this.name, bower.getName());
}
bower.bowBack(this);
}
Can I use other approaches to resolve this deadlock issue.
Especially, I wonder that Thread.sleep() can be a solution for deadlock and how I can use it.
Could you let me know about the possibility of Thread.sleep() and other approaches?
Thanks alot