package hprof;

/**
 * モニターの競合監視用サンプル
 */
public class HprofMonitor extends Thread {

	/**
	 * アプリケーション
	 * @param args 引数
	 */
	public static void main(String[] args) {
		// デッドロックを起こすクラス
		HprofMonitor lock1 = new HprofMonitor("LOCK1");
		HprofMonitor lock2 = new HprofMonitor("LOCK2");
		// お互いを監視
		lock1.setWatch(lock2);
		lock2.setWatch(lock1);
		// 実行スレッドを起動する
		lock1.start();
		lock2.start();

		// デッドロックするので強制終了
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
		}
		System.exit(0);

	}

	private String name;
	private HprofMonitor watch;

	/**
	 * オブジェクト名をつけてインスタンスを作成.
	 * @param name 名前
	 */
	public HprofMonitor(String name) {
		this.name = name;
	}
	
	/**
	 * ロックするオブジェクトを設定する。
	 * @param watch ロックするオブジェクト
	 */
	public void setWatch(HprofMonitor watch) {
		this.watch = watch;
	}

	/**
	 * 
	 */
	public void run() {
		synchronized (this) {
			//System.out.println(name + " locked from run().");

			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
			}

			this.watch.lock();
		}
	}

	/**
	 * 
	 */
	public synchronized void lock() {
		synchronized (this) {
			//System.out.println(name + " locked from lock().");
		}
	}

}
