如题,要求简单易懂,不要长篇大论的转载。

解决方案 »

  1.   

    刚好在看Tutorial,里面有,Deadlock的例子还很好懂,避免Deadlock用了Lock我看得不是很懂,copy给你吧
    没本事自己写public class Deadlock {
        static class Friend {
            private final String name;
            public Friend(String name) {
                this.name = name;
            }
            public String getName() {
                return this.name;
            }
            public synchronized void bow(Friend bower) {
                System.out.format("%s: %s has bowed to me!%n", 
                        this.name, bower.getName());
                bower.bowBack(this);
            }
            public synchronized void bowBack(Friend bower) {
                System.out.format("%s: %s has bowed back to me!%n",
                        this.name, bower.getName());
            }
        }    public static void main(String[] args) {
            final Friend alphonse = new Friend("Alphonse");
            final Friend gaston = new Friend("Gaston");
            new Thread(new Runnable() {
                public void run() { alphonse.bow(gaston); }
            }).start();
            new Thread(new Runnable() {
                public void run() { gaston.bow(alphonse); }
            }).start();
        }
    }
    不会有死锁的代码:import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    import java.util.Random;public class Safelock {
        static class Friend {
            private final String name;
            private final Lock lock = new ReentrantLock();        public Friend(String name) {
                this.name = name;
            }        public String getName() {
                return this.name;
            }        public boolean impendingBow(Friend bower) {
                Boolean myLock = false;
                Boolean yourLock = false;
                try {
                    myLock = lock.tryLock();
                    yourLock = bower.lock.tryLock();
                } finally {
                    if (! (myLock && yourLock)) {
                        if (myLock) {
                            lock.unlock();
                        }
                        if (yourLock) {
                            bower.lock.unlock();
                        }
                    }
                }
                return myLock && yourLock;
            }
                
            public void bow(Friend bower) {
                if (impendingBow(bower)) {
                    try {
                        System.out.format("%s: %s has bowed to me!%n", 
                                this.name, bower.getName());
                        bower.bowBack(this);
                    } finally {
                        lock.unlock();
                        bower.lock.unlock();
                    }
                } else {
                    System.out.format("%s: %s started to bow to me, but" +
                            " saw that I was already bowing to him.%n",
                            this.name, bower.getName());
                }
            }        public void bowBack(Friend bower) {
                System.out.format("%s: %s has bowed back to me!%n",
                        this.name, bower.getName());
            }
        }    static class BowLoop implements Runnable {
            private Friend bower;
            private Friend bowee;        public BowLoop(Friend bower, Friend bowee) {
                this.bower = bower;
                this.bowee = bowee;
            }
        
            public void run() {
                Random random = new Random();
                for (;;) {
                    try {
                        Thread.sleep(random.nextInt(10));
                    } catch (InterruptedException e) {}
                    bowee.bow(bower);
                }
            }
        }
                    public static void main(String[] args) {
            final Friend alphonse = new Friend("Alphonse");
            final Friend gaston = new Friend("Gaston");
            new Thread(new BowLoop(alphonse, gaston)).start();
            new Thread(new BowLoop(gaston, alphonse)).start();
        }
    }
      

  2.   

    自己写的。产生了死锁。稍微看下代码,再运行,看打印的信息。锁lock1和lock2被占用后就没有释放。所以死锁了。/**
     * @author bzwm
     *
     */
    public class Deadlock {

    public static void main(String args[])
    {
    final ThreadImp imp = new ThreadImp();
    //启动线程执行method1
    new Thread(new Runnable() {
    public void run() {
    imp.method1();
    }
    }).start(); //启动线程执行method2
    new Thread(new Runnable() {
    public void run() {
    imp.method2();
    }
    }).start(); }
    }class ThreadImp
    {
    private Object lock1 = new Object();

    private Object lock2 = new Object();

    public void method1()
    {
    System.out.println("---Method1 需要lock1锁---");
    synchronized (lock1)
    {
    System.out.println("---Method1 获得lock1锁---");
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("method1睡好了,准备执行invokeByMethod1");
    invokeByMethod1();
    }

    System.out.println("---Method1 释放lock1锁---");
    }

    private void invokeByMethod1()
    {
    System.out.println("---invokeByMethod1 需要lock2锁---");
    synchronized (lock2)
    {
    System.out.println("invokeByMethod1获得lock2锁,准备执行method2");
    }
    System.out.println("---invokeByMethod1 释放lock2锁---");
    }

    public void method2()
    {
    System.out.println("###Method2 需要lock2锁###");
    synchronized (lock2)
    {
    System.out.println("###Method2 获得lock2锁###");
    System.out.println("method2获得lock2锁,然后执行invokeByMethod2");
    try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    invokeByMethod2();
    }
    System.out.println("###Method2 释放lock2锁###");
    }

    private void invokeByMethod2()
    {
    System.out.println("---invokeByMethod2 需要lock1锁---");
    synchronized (lock1)
    {
    System.out.println("invokeByMethod2获得lock1锁");
    }
    System.out.println("---invokeByMethod2 释放lock1锁---");
    }
    }
      

  3.   

    不死锁的情况,其实这里把我写的 Thread.sleep()都去掉就不会死锁了。但这种两个线程执行的方法,需要互相持有的锁的情况,最好不要出现。