独習Java第9章 マルチスレッドプログラミング(9.4)

スレッドのデッドロックについての部分。
環境:MacOS 10.6.5 / Oracle(Sun) JDK6 update22

書いてみる

// DeadLock.java
class Lock
{
  Lock(String name)
  {
    this._name = name;
  }

  public void setAnotherLock(Lock lock)
  {
    this._anotherLock = lock;
  }

  public synchronized void write()
  {
    System.out.println(this._name + ": write");
  }

  public synchronized void writeAndCall()
  {
    System.out.println(this._name + ": write");
    this._anotherLock.write();
  }

  private String _name;
  private Lock _anotherLock;
}

class LockThread extends Thread
{
  LockThread(Lock lock)
  {
    this._lock = lock;
  }

  public void run()
  {
    for (int i = 0; i < 50000; i++)
    {
      this._lock.writeAndCall();
    }
  }

  private Lock _lock;
}

class DeadLock
{
  public static void main(String args[])
  {
    Lock l1 = new Lock("l1");
    Lock l2 = new Lock("l2");

    l1.setAnotherLock(l2);
    l2.setAnotherLock(l1);

    Thread t1 = new LockThread(l1);
    Thread t2 = new LockThread(l2);

    t1.start();
    t2.start();

    try
    {
      t1.join();
      t2.join();
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }

    System.out.println("end");
  }
}

こんな感じかな。これで実行すると……

実行してみる

$ javac -J-Dfile.encoding=UTF-8 DeadLock.java
$ java DeadLock
l1: write
l2: write

このまま固まる。Ctrl-Cで終了。
場合によってはもっと表示されたりするみたい。何回かやってみたら結果が変わった。


まあこういうコードは書かないようにしましょう、ってこんなに単純なコードを書く訳も無く。
これでデッドロックの部分は終わり。書かない方がいいコードを書いて終わりってのもなー……