哲学家吃饭问题-对线程死锁的理解

哲学家就餐问题-对线程死锁的理解


两个线程的死锁问题:

  1. 线程1 首先占有对象1,接着试图占有对象2
  2. 线程2 首先占有对象2,接着试图占有对象1
  3. 线程1 等待线程2释放对象2
  4. 与此同时,线程2等待线程1释放对象1
    此时就会一直等待下去,直到天荒地老,海枯石烂,山无棱 ,天地合。。。

史上著名哲学家吃饭问题:

一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭,如图2-10所示。哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿的时候,才试图拿起左、
右两根筷子(一根一根地拿起)。如果筷子已在他人手上,则需等待。饥饿的哲学家只有同时拿到了两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。

Java代码演示:

SiSuo.java

package DuoXianCheng;

public class SiSuo {
	
	//哲学家就餐问题
	//哲学家有了左手边的筷子,想取得右手边的筷子
	public static void main(String[] args) {
		
		final Chopstick c1 = new Chopstick("筷子1");
		final Chopstick c2 = new Chopstick("筷子2");
		final Chopstick c3 = new Chopstick("筷子3");
		
		//哲学家1有筷子1,想取得筷子2
		Thread philosopher1 = new Thread() {
			public void run() {
				synchronized (c1) {
					System.out.println("哲学家1已经占有" + c1);
				
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					System.out.println("哲学家1试图占有" + c2);
					System.out.println("哲学家1等待中。。。");
					
					synchronized (c2) {
						System.out.println("哲学家1获得" + c2);
					}
					
				}
				
				
			}
		};
		
		
		//哲学家2有筷子2,想取得筷子3
		Thread philosopher2 = new Thread() {
			public void run() {
				synchronized (c1) {
					System.out.println("哲学家2已经占有" + c2);
				
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					System.out.println("哲学家2试图占有" + c3);
					System.out.println("哲学家2等待中。。。");
					
					synchronized (c3) {
						System.out.println("哲学家2获得" + c3);
					}
					
				}
				
				
			}
		};
		
		//哲学家3有筷子3,想取得筷子1
		Thread philosopher3 = new Thread() {
            public void run() {
                synchronized (c3) {
                    System.out.println("哲学家3已占有" + c3);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("哲学家3试图占有" + c1);
                    System.out.println("哲学家3等待中 。。。。");
                    
                    synchronized (c1) {
                        System.out.println("哲学家3获得" + c1);
                    }
                }
            }
        };
		
        philosopher1.start();
        philosopher2.start();
        philosopher3.start();
		
	}
}

Chopstick.java

package DuoXianCheng;

public class Chopstick {

	private String name;
	 
    public String getName() {
        return name;
    }
 
    public void setChopstick(String name) {
        this.name = name;
    }
 
    public Chopstick(String name) {
        super();
        this.name = name;
    }
 
    public String toString() {
        return getName();
    }
}

你可能感兴趣的:(JAVA进阶)