zoukankan      html  css  js  c++  java
  • 死锁的形成原理

    死锁形成的四个条件我就不说了,大家可以自行百度看博客

    今天学死锁,老师讲的时候迷迷糊糊的,我看了4遍都没看懂

    简直是讲了个寂寞,后面看了博客才看懂,一个很简单的东西

    老师讲来讲去都没讲明白

    原理:

    线程T1在对资源R1进行操作,并且给R1上锁

    线程T2在对资源R2进行操作,并且给R2上锁

    但是这两个线程太贪心,在自己线程的执行过程中,虽然各自对自己使用的资源完成了操作,但是并没有对资源进行解锁,还对别人的资源有想法

    如果是synchronized同步锁

    那么就是T1在synchronized代码块或者同步方法中除了执行对R1的操作,还写了对R2资源的操作

    可是T2也在synchronized代码块或者同步方法中除了执行对R2的操作,还写了对R1资源的操作

    这样一来,T1此时锁住了R1不放,T2锁住了R2不放

    此时T1请求执行R2,需要等待T2放出R2,所以T1阻塞住,在等待T2释放

    与此同时T2请求执行R1,需要等待T1放出R1,所以T2阻塞住,在等待T1释放

    完蛋了,两个线程都在阻塞,就产生了死锁

    当然如果是lock锁,那么就是在unlock方法执行之前还做了对其他资源的操作,同理如上

    形象一点说,死锁的产生,举个栗子

    A和B在联手写代码,A写前端,B写后端

    A写完了前端代码不放出来,他想要把B写的后端代码拿过来然后一起交给项目经理

    巧了,B也是这么想的,手里也攥着后端代码不放

    所以呢,A和B都在等对方妥协,就导致了项目停止,A和B各自的代码都被他们锁在了电脑里,就产生了死锁,谁也没有办法解开对方的电脑

    所以解决办法是什么:

    A写完前端,项目经理要求A立马给他

    B写完后端,项目经理也要求B立马给他

    A和B交完代码,没有什么功劳可以抢了

    那么就要协同合作,A可以访问B的代码了,看看也无妨,学学后端怎么写

    B也可以访问A的代码,学学前端怎么写

    这样就不会产生死锁了

  • 相关阅读:
    leetcode[104]Maximum Depth of Binary Tree
    leetcode[105]Construct Binary Tree from Preorder and Inorder Traversal
    leetcode[106]Construct Binary Tree from Inorder and Postorder Traversal
    leetcode[107]Binary Tree Level Order Traversal II
    leetcode[108]Convert Sorted Array to Binary Search Tree
    iOS开发的各种开源库、开源资料、开源技术等等的索引库
    Graphics API Debugger
    ps滤镜效果的原理
    ps滤镜中英文对照
    ps原理
  • 原文地址:https://www.cnblogs.com/skyvalley/p/13807751.html
Copyright © 2011-2022 走看看