Javaマルチスレッド同期デッドロックルーチン


コンピューターの分野には哲学者の食事問題という古典的な問題がある.あるテーブルのそばには、5人の哲学者が座っていて、哲学者の左右の手元に箸が1本ずつあります.哲学者一人一人が同時に箸を2本取らなければ食事ができないことを要求した.食事を始める时すべての哲学者はすべて身の回りの箸を持って、このようにすべての哲学者の手の中でただ1本の箸だけあって、哲学は谁も先に箸を置きたくなくて、すべて他の哲学者が先に箸を置くことを望みます.これでは哲学者一人一人がご飯を食べられない.
上記の問題は、コンピュータ内のスレッドスケジューリング時にも発生します.プログラムに2つのスレッド1と2があると仮定します.各スレッドにはそれぞれモニタAとBがある.スレッド1はオブジェクトAのモニタをロックし、オブジェクトBのモニタを待機し、スレッド2はオブジェクトBのモニタをロックし、オブジェクトAのモニタを待機し、このように2つのスレッドが実行できなくなり、デッドロックをもたらす.
package com.javase.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class DeadLockDemo {

	public static void main(String[] args) {
		Runnable thread1 = new DeadLockThread(true);
		Runnable thread2 = new DeadLockThread(false);
		ExecutorService es = Executors.newCachedThreadPool();;
		es.execute(thread1);
		es.execute(thread2);
		es.shutdown();
	}

}

class MyThreadLock {
	public static Object lock1 = new Object();
	public static Object lock2 = new Object();
}

class DeadLockThread implements Runnable{
	boolean flag;
	public DeadLockThread(boolean flag){
		this.flag=flag;
	}
	public void run(){
		if(flag){
			synchronized(MyThreadLock.lock1){
				System.out.println("if lock1");
				synchronized(MyThreadLock.lock2){
					System.out.println("if lock2");
				}
			}
		}else{
			synchronized(MyThreadLock.lock2){
				System.out.println("else lock2");
				synchronized(MyThreadLock.lock1){
					System.out.println("else lock1");
				}
			}
		}
	}
}