zoukankan      html  css  js  c++  java
  • [三]多线程编程-死锁

    继 多线程编程-单例模式: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,造成了死锁。。。

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

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

  • 相关阅读:
    CF1391D 【505】
    CF1389C 【Good String】
    CF1364C 【Ehab and Prefix MEXs】
    CF1353E 【K-periodic Garland】
    CF1349A 【Orac and LCM】
    CF1352C 【K-th Not Divisible by n】
    CF413D 【2048】
    CF257B 【Playing Cubes】
    CF267A 【Subtractions】
    2018.8.16提高B组模拟考试
  • 原文地址:https://www.cnblogs.com/wangfajun/p/6552904.html
Copyright © 2011-2022 走看看