業とデッドロックさせるコード

package lesson.java.lang;

public class ThredDeadLockTest {

	static LockObject lockObjA = new LockObject("lockObjA");

	static LockObject lockObjB = new LockObject("lockObjB");

	public static void main(String[] args) throws InterruptedException {
		Thread th = new Thread("TH_A") {
			public void run() {
				synchronized (lockObjA) {
					lockObjA.lock();

					try {
						Thread.sleep(50);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}

					synchronized (lockObjB) {
						lockObjB.lock();
					}
					lockObjB.unlock();
				}
				lockObjA.unlock();
			}
		};
		th.start();

		synchronized (lockObjB) {
			lockObjB.lock();
			Thread.sleep(50);

			synchronized (lockObjA) {
				lockObjA.lock();
			}
			lockObjA.unlock();
		}
		lockObjB.unlock();

		System.out.println("無事デッドロックしませんでした。");
	}

}

class LockObject {
	private String name;

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

	public void lock() {
		Thread cth = Thread.currentThread();
		System.out.println(cth.getName() + " " + name + " Lock");
	}

	public void unlock() {
		Thread cth = Thread.currentThread();
		System.out.println(cth.getName() + " " + name + " Unlock");
	}
}

結果は以下のようになりました。

main lockObjB Lock
TH_A lockObjA Lock