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

  hehaitao074

    死锁的原因:
     线程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();
                    }
                }
            }
        }
    
    }
    

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