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,造成了死锁。。。

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

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

  • 相关阅读:
    Quartz.Net系列(二):介绍、简单使用、对比Windows计划任务
    Quartz.Net系列(一):Windows任务计划程序
    Linux下swap到底有没有必要使用
    Linux服务器有大量的TIME_WAIT状态
    HTTP请求头中的X-Forwarded-For介绍
    Keepalived实现服务高可用
    Gitlab常规操作
    Git 常用命令
    HTTP常见状态码
    《Docker从入门到跑路》之多阶段构建
  • 原文地址:https://www.cnblogs.com/wangfajun/p/6552904.html
Copyright © 2011-2022 走看看