// Friendly.java class Friendly { private Friendly partner; private String name; public Friendly(String name) { this.name = name; } public synchronized void hug() { System.out.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 becomeFriend(Friendly partner) { this.partner = partner; } public static void main(String[] args) { final Friendly jareth = new Friendly("jareth"); final Friendly cory = new Friendly("cory"); jareth.becomeFriend(cory); cory.becomeFriend(jareth); new Thread(new Runnable() { public void run() { jareth.hug(); } }, "Thread1").start(); new Thread(new Runnable() { public void run() { cory.hug(); } }, "Thread2").start(); } }これを実行すると,
% java Friendly Thread1 in jareth.hug() trying to invoke cory.hugBack() Thread1 in cory.hugBack() Thread2 in cory.hug() trying to invoke jareth.hugBack() Thread2 in jareth.hugBack() % java Friendly Thread1 in jareth.hug() trying to invoke cory.hugBack() Thread1 in cory.hugBack() Thread2 in cory.hug() trying to invoke jareth.hugBack() Thread2 in jareth.hugBack() % java Friendly Thread1 in jareth.hug() trying to invoke cory.hugBack() Thread1 in cory.hugBack() Thread2 in cory.hug() trying to invoke jareth.hugBack() Thread2 in jareth.hugBack()デッドロックを回避する方法としては,リソース順序付け(resource ordering) という方法がある.これは,ロックを獲得しなければいけない複数のオブジェ クトに対して順序を決めて,その順序で常にロックを獲得するようにする方法で ある.この方法であれば,二つのスレッドが互いに一つずつのロックを獲得して, さらに他方が持っているロックを獲得しようとすることができなくなる.