在计算机领域有一个很经典的问题——哲学家进餐问题。在一个桌子旁边,围坐着五个哲学家,每个哲学家左右手边各有一支筷子。要求每个哲学家必须同时拿起两支筷子才可以吃饭。开始吃饭的时候每个哲学家都去拿身边的筷子,这样每个哲学家的手里就只有一支筷子,哲学谁也不想先将筷子放下,都希望别的哲学家先放下筷子。这样每个哲学家都吃不到饭。
上面的问题同样也会在计算机中线程调度的时候发生。假设在程序中有两个线程1和2。每个线程分别有一个监视器A和B。线程1锁住了对象A的监视器,等待对象B的监视器,线程2锁住了对象B的监视器,等待对象A的监视器,这样两个线程就都无法运行,就造成了死锁。
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");
}
}
}
}
}