I have simple example which illustrates how to cause deadlock:
class Player {
private String name;
public Player(String name) {
super();
this.name = name;
}
public synchronized void passTo(Player p) {
System.out.println(this.name + " passes to " + p.name);
// to imitate long task
for (int i = 0; i < 1000000000; i++)
;
p.passBack(this);
}
private synchronized void passBack(Player p) {
System.out.println(this.name + " passes back to " + p.name);
}
}
public class Deadlock {
public static void main(String[] args) {
final Player ivan = new Player("Ivan");
final Player petro = new Player("Petro");
new Thread(new Runnable() {
public void run() {
ivan.passTo(petro);
}
}).start();
new Thread(new Runnable() {
public void run() {
petro.passTo(ivan);
}
}).start();
}
}
When I run this program it causes deadlock.
What are possible solutions to prevent this simple deadlock?
Thank you!