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