Newsletter sign-up
View all newsletters

Enterprise Java Newsletter
Stay up to date on the latest tutorials and Java community news posted on JavaWorld

JavaWorld Daily Brew

Thread question



example code from "Java The Programming Language (3rd)"

public class Friendly {

    private Friendly partner;
    private String name;

    public Friendly(String name) {
        this.name = name;
    }

    public synchronized void hug() {
        System.err.println(Thread.currentThread().getName()
        + " in " + name + ".hug() trying to invoke "
        + partner.name + ".hugback()");
        partner.hugback();
    }

    private synchronized void hugback() {
        System.out.println(Thread.currentThread().getName()
        + " in " + name + ".hugback()");
    }

    public void becomdeFriend(Friendly partner) {
        this.partner = partner;
    }

    public static void main(String[] args) {

        final Friendly jareth = new Friendly("jareth");
        final Friendly cory = new Friendly("cory");

        jareth.becomdeFriend(cory);
        cory.becomdeFriend(jareth);

        new Thread(new Runnable() {
            public void run() {
                jareth.hug();
            }
        }, "Thread1").start();

        new Thread(new Runnable() {
            public void run() {
                cory.hug();
            }
        }, "Thread2").start();
    }
}

Obviously, it may come to a deadlock.
But when it works ok, sometimes it gives result like:

run:  
Thread1 in cory.hugback()  
Thread1 in jareth.hug() trying to invoke cory.hugback()  
Thread2 in cory.hug() trying to invoke jareth.hugback()  
Thread2 in jareth.hugback()  
BUILD SUCCESSFUL (total time: 0 seconds) 

or
run:  
Thread1 in cory.hugback()  
Thread2 in jareth.hugback()  
Thread1 in jareth.hug() trying to invoke cory.hugback()  
Thread2 in cory.hug() trying to invoke jareth.hugback()  
BUILD SUCCESSFUL (total time: 0 seconds)

I can't figure out the order of the messages. How can it be ?
Can you give me explanation?
Thanks in advance.