多线程死锁的模拟 有更新!

2017-09-05

死锁的原因:
 线程1锁住资源A等待资源B,线程2锁住资源B等待资源A,两个线程
都在等待自己需要的资源,而这些资源被另外的线程锁住,这些线
程你等我,我等你,谁也不愿意让出资源,这样死锁就产生了。
 哲学家进餐问题

 解决死锁的办法之一就是:加大锁的粒度。

public class DeadLock02 {
	// 绑匪:说:你给我500亿,我就放了你儿子,目的:得到了500亿
	// 富翁:说:你先放了我儿子,,我就给你钱,目的:赎回儿子。
	public static void main(String[] args) {
		MyThread02 mt1 = new MyThread02();
		MyThread02 mt2 = new MyThread02();
		mt1.flag = true;
		mt2.flag = false;
		new Thread(mt1).start();
		new Thread(mt2).start();
	}
}

class Kidnapper{
	public void say(){
		System.out.println("你给我500亿,我就放了你儿子");
	}
	public void get(){
		System.out.println("得到了500亿");
	}
}
class Richman{
	public void say(){
		System.out.println("你先放了我儿子,,我就给你钱");
	}
	public void get(){
		System.out.println("赎回儿子");
	}
}

class MyThread02 implements Runnable{
	private static Kidnapper k = new Kidnapper();
	private static Richman r = new Richman();

	boolean flag = true;
	@Override
	public void run() {
		if(flag){//kidnapper
			synchronized (k) {
				k.say();
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				synchronized (r) {
					k.get();
				}
			}
		}else{//richman
			synchronized (r) {
				r.say();
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				synchronized (k) {
					r.get();
				}
			}
		}
	}

}

所线程要尽量避免死锁现象的产生

评论
发表评论