独習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で終了。
場合によってはもっと表示されたりするみたい。何回かやってみたら結果が変わった。
まあこういうコードは書かないようにしましょう、ってこんなに単純なコードを書く訳も無く。
これでデッドロックの部分は終わり。書かない方がいいコードを書いて終わりってのもなー……