美文网首页
一个死锁的例子

一个死锁的例子

作者: Bejamin | 来源:发表于2017-07-30 20:03 被阅读285次

    先举个栗子。

    /**
     * Created by Benjamin on 07/30/030.
     */
    public class TestDeadLock implements Runnable {
        public int    flag = 1;
        static Object o1   = new Object(), o2 = new Object();
    
        @Override
        public void run() {
            System.out.println("flag = " + flag);
            if (flag==1){
                synchronized (o1) {
                    try {
                        Thread.sleep(500);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    synchronized (o2){
                        System.out.println("1");
                    }
                }
            }
    
            if (flag==0){
                synchronized (o2){
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (o1){
                        System.out.println("0");
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            TestDeadLock t1 = new TestDeadLock();
            TestDeadLock t2 = new TestDeadLock();
            t1.flag = 1;
            t2.flag = 0;
            new Thread(t1).start();
            new Thread(t2).start();
        }
    }
    
    产生死锁的原因主要是:
    • 系统资源不足
    • 资源分配不当
    • 推进顺序不合适
    产生死锁的四个必要条件:
    • 互斥:一个资源每次只能被一个进程使用
    • 资源保持:一个进程被阻塞时,不释放已有资源
    • 不可抢占:正在使用的资源不能被剥夺
    • 循环等待:循环等待未被分配的资源
    例子死锁的原因:

    静态对象o1和o2是类的资源。当flag=1的线程请求到o1资源时,再申请资源o2时,o2资源已经被flag=0的线程占有,并且后者需要申请资源o1才能继续执行。这样,二者就形成了相互等待的情形,故而形成死锁。

    相关文章

      网友评论

          本文标题:一个死锁的例子

          本文链接:https://www.haomeiwen.com/subject/daeklxtx.html