码迷,mamicode.com
首页 > 移动开发 > 详细

Android-Java-死锁

时间:2019-01-08 15:39:20      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:.com   lock   star   lse   rgs   bool   需要   嵌套   第一步   

死锁:程序不往下执行了,程序又没有结束,就一直卡在哪里;

在使用synchronized的时候要避免死锁,synchronized嵌套就可能会引发死锁,需要严格的检查代码,排除死锁发生的可能;

 

特意演示死锁的案例:synchronized嵌套,使用多把同步锁??

package android.java.thread15;

/**
 * 定义死锁任务
 */
class DieLockThread extends Thread {

    /**
     * 此变量已经不是共享数据了,因为:
     *              DieLockThread extends Thread
     *              new DieLockThread().start();
     *              new DieLockThread().start();
     *
     * 所以:Thread-0有自己的flag     Thread-1也有自己的flag
     */
    private boolean flag;

    public DieLockThread(boolean flag) {
        this.flag = flag;
    }

    @Override
    public void run() {

        int i = 0;
        int j = 0;

        if (flag) {

            while (true) {

                synchronized (Lock.LOCK1) // 使用第一把锁??
                {

                    synchronized (Lock.LOCK2) // 使用第二把锁??
                    {
                        System.out.println("一一一一一一一一一一一一" + i++);
                    }
                }

            }

        } else {

            while(true) {

                synchronized (Lock.LOCK2) // 使用第二把锁??
                {

                    synchronized (Lock.LOCK1) // 使用第一把锁??
                    {
                        System.out.println("二二二二二二二二二二二二" + j++);
                    }

                }

            }

        }
    }
}

/**
 * 定义两把锁??
 */
class Lock {
    public final static Object LOCK1 = new Object();
    public final static Object LOCK2 = new Object();
}

public class DieLockDemo {

    public static void main(String[] args) {
        new DieLockThread(true).start();
        new DieLockThread(false).start();
    }

}

 

死锁结果,程序一直卡住不动了,不往下执行了:

技术分享图片

 

分析死锁??:

if (flag) {

            while (true) {
                // 第一步:CPU随机性切换到:Thread-1   Thread-1正常往下走......
                // 第六步:CPU随机性切换到:Thread-1 ,然后判断同步锁 注意:此时的同步锁??Lock == 第二把锁??, 第二把锁??是被Thread-1锁定的,就造成了线程之间不和谐:死锁

                synchronized (Lock.LOCK1) // 使用第一把锁??
                {

                    synchronized (Lock.LOCK2) // 使用第二把锁??
                    {
                        System.out.println("一一一一一一一一一一一一" + i++);
                        // 第二步:CPU随机性切换到:Thread-1  就在此时,CPU执行权没有了,  CPU去执行其他线程了 
                    }
                }
                // 第四步:   CPU随机性切换到:Thread-1   Thread-1正常往下走完,并解锁??
            }

        } else {

            while(true) {
                // 第三步:CPU随机切换到:Thread-0,然后判断同步锁 注意:此时的同步锁??Lock == 第二把锁??, 第二把锁??是被Thread-1锁定的,就造成了线程之间不和谐:死锁

                synchronized (Lock.LOCK2) // 使用第二把锁??
                {

                    synchronized (Lock.LOCK1) // 使用第一把锁??
                    {

                        第五步:CPU随机性切换到:Thread-0 就在此时,CPU执行权没有了,  CPU去执行其他线程了 

                        System.out.println("二二二二二二二二二二二二" + j++);
                    }

                }

            }

        }

 

开发中,千万不能出现死锁;

出现死锁的原因有:多线程并发/多个地方调用 + synchronized(多把锁)

 

Android-Java-死锁

标签:.com   lock   star   lse   rgs   bool   需要   嵌套   第一步   

原文地址:https://www.cnblogs.com/android-deli/p/10238153.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!