Deadlock

Pq q dá deadlock no codigo abaixo se há 2 objetos Friend???


public class Deadlock {

    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();
    }
}

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());
    }
}

Abraços
João Sávio

O problema esta aqui:

bower.bowBack(this);

bowBack é synchronized, um metodo sync dentro do outro.

A ideia eh que:
alphonse.bow(gaston); e
gaston.bowBack(alphonse);

http://guj.com.br/java.tutorial.artigo.43.1.guj