• [三]多线程编程-死锁


    继 多线程编程-单例模式:http://www.cnblogs.com/wangfajun/p/6549870.html 介绍的单例模式后,我们接下来说下同步中的一个问题:死锁

    什么是死锁?先来个程序例子:

    public class Test {
        public static void main(String[] args) {
            new Thread(new DeadLock(true)).start();
            new Thread(new DeadLock(false)).start();
        }
    }
    /**
     * 锁对象
     */
    class Lock{
        static Object one = new Object();
        static Object two = new Object();
    }
    class DeadLock implements Runnable{
        private boolean flag;
        DeadLock(boolean flag){
            this.flag = flag;
        }
        @Override
        public void run() {
            if(flag){
                synchronized (Lock.one) {
                    System.out.println("if one");
                    synchronized (Lock.two) {
                        System.out.println("if two");
                    }
                }
            }else{
                synchronized (Lock.two) {
                    System.out.println("else two");
                    synchronized (Lock.one) {
                        System.out.println("else one");
                    }
                }
            }
            
        }
    }
    执行结果:
      if one
      else two
    

    假设上面的两个线程为A跟B,根据执行结果,首先A获得了Lock.one锁打印了if one,接下来A想要获得Lock.two,但是执行结果并没有打印if two,说明A并没有得到Lock.two,为什么?

    你看执行结果的else two,说明B获得了Lock.two,A想要获取B获得的Lock.two,但是B不给,因为B也想要A拥有的Lock.one锁,但A也不给B,造成了死锁。。。

    举个例子吧:吃饭了,我有一根筷子,你有一根筷子,我想要你的那根筷子吃上饭,你想要我的这根筷子吃上饭,我们都不给对方,那饭别吃了。。。

    死锁就说到这里,明白否?

  • 相关阅读:
    补番完了 来自深渊
    160CrackMe第十九Brad Soblesky.2
    MyBio小隐本记注册破解
    WDTP注册破解
    对话框和普通窗口工作方式的区别
    Win32汇编学习(11):对话框(2)
    Win32汇编学习(10):对话框(1)
    MongoDB的复制源oplog
    Windows搭建MongoDB复制集
    MangoDB的下载和安装
  • 原文地址:https://www.cnblogs.com/wangfajun/p/6552904.html
Copyright © 2020-2023  润新知