线程死锁是什么

线程死锁是什么线程死锁:两个或两个以上的线程在执行过程中同时被阻塞,它们中的某个或者全部都在等待某个资源被释放,由于线程被无限期的阻塞,系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程被称为线程死锁如上图所示,线程A持有资源2,线程B持有资源1,它们都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态如果想要了解什么是线程阻塞的朋友,可以看我之前发的一篇线程的阻塞线程死锁示例代码如下:线程A通过synchronized(resource1)获得resource1的监视器锁,然后通

大家好,又见面了,我是你们的朋友全栈君。

线程死锁:

两个或两个以上的线程在执行过程中同时被阻塞,它们中的某个或者全部都在等待某个资源被释放,由于线程被无限期的阻塞,系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程被称为线程死锁

线程死锁是什么
线程死锁的演示

 如上图所示,线程A持有资源2,线程B持有资源1,它们都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态

 如果想要了解什么是线程阻塞的朋友,可以看我之前发的一篇线程的阻塞

线程死锁示例代码如下:

public class Demo {

    private static Object resource1 = new Object();    //资源 1
    private static Object resource2 = new Object();    //资源 2

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (resource1) {
                System.out.println(Thread.currentThread() + "get resource1");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resource2");
                synchronized (resource2) {
                    System.out.println(Thread.currentThread() + "get resource2");
                }
            }
        }, "线程 1").start();
        new Thread(() -> {
            synchronized (resource2) {
                System.out.println(Thread.currentThread() + "get resource2");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resource1");
                synchronized (resource1) {
                    System.out.println(Thread.currentThread() + "get resource1");
                }
            }
        }, "线程 2").start();
    }
}

输出结果:
Thread[线程 1,5,main]get resource1
Thread[线程 2,5,main]get resource2
Thread[线程 1,5,main]waiting get resource2
Thread[线程 2,5,main]waiting get resource1

线程 A 通过 synchronized (resource1) 获得 resource1 的监视器锁,然后通过Thread.sleep(1000);让线程 A 休眠 1s 为的是让线程 B 得到CPU执行权,然后获取到 resource2 的监视器锁。线程 A 和线程 B 休眠结束了都开始企图请求获取对方的资源,然后这两个线程就会陷入互相等待的状态,这也就产生了死锁

 不了解synchronized的友友们,可以翻我之前的一篇关于synchronized

形成死锁的四个必要条件:

  1. 互斥条件:线程(进程)对于所分配到的资源具有排它性,即一个资源只能被一个线程(进程)占用,直到被该线程(进程)释放
  2. 请求与保持条件:一个线程(进程)因请求资源而被阻塞时,对以获得的资源保持不放
  3. 不剥夺条件:线程(进程)已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源
  4. 循环等待条件:当发生死锁时,所等待的线程(进程)必定会形成一个环路(类似于死循环),造成永久阻塞

实际应用中,为了避免线程死锁,必须打破其中一个条件:

  • 互斥条件没有办法破坏,因为我们用锁本来就是想让它们互斥的(临界资源需要互斥访问)
  • 破坏请求与保持条件,一次性申请所有资源
  • 破坏不剥夺条件,占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放该线程占有的资源
  • 破坏循环等待条件,按某一顺序申请资源来预防死锁,释放资源则按此顺序的反序来释放

大家有不理解可以翻我博客哦!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158542.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 操作系统用户态和内核态之间的切换过程是什么_用户进程从用户态切换到内核态

    操作系统用户态和内核态之间的切换过程是什么_用户进程从用户态切换到内核态操作系统用户态和内核态之间的切换过程1.用户态和内核态的概念区别究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子:1)例子voidtestfork(){if(0==fork())…

    2022年9月17日
    0
  • 十进制小数转换为二进制小数采用方法为乘2取整法?_小数点二进制转10进制

    十进制小数转换为二进制小数采用方法为乘2取整法?_小数点二进制转10进制十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的整数部分为零,或者整数部分为1,此时0或1为二进制的最后一位。或者达到所要求的精度为止。  然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有…

    2022年9月24日
    0
  • pip 更新命令

    pip 更新命令 pip查询版本:pipshowpip 或pip-Vanaconda更新命令:condainstallmingwlibpythonNomodulenamedpip问题:运行 python-mensurepipNomodulenamed’pip._internal’问题:windows下curlhttps://bootstr…

    2022年6月11日
    40
  • pycharm安装不上包_pycharm调用不了已安装的包

    pycharm安装不上包_pycharm调用不了已安装的包如下图方式安装不成功,显示pip版本需要升级的问题:cmd方式安装bs4仍然失败:cmd以管理员身份运行,输入python-mpipinstall–upgradepip,将pip升级到最新版完成后可输入:piplist查看此时输入:pipinstallbs4成功输入python;importbs4,没有报错则成功;exit()退出但此时发现在pycharm中仍然无法导入bs4:原因:安装的bs4不在该项…

    2022年8月27日
    7
  • 奔图打印机官网驱动_施乐105P一样的打印机

    奔图打印机官网驱动_施乐105P一样的打印机奔图P3060DW打印机驱动带给大家官方最新驱动程序,这款打印机十分小巧功能却很全面,高速双面黑白激光打印机可以满足大家日常的工作及其它需求,驱动程序非常必要,成功安装后方可使用打印机。奔图P3060DW打印机参数:型号P3060DW打印参数打印速度30ppm(A4)32ppm(Letter)首页打印时间≤8.5秒最大月打印量25000页建议月打印量250页到3000页分辨率(dpi)最大12…

    2022年8月30日
    1
  • bWAPP靶场实战[通俗易懂]

    bWAPP靶场实战[通俗易懂]文章目录一、靶场介绍二、靶场搭建2.1安装类型2.2独立安装三、漏洞实战SSRF远程文件包含端口扫描一、靶场介绍  集成了超过100余个网络漏洞,phpweb漏洞靶场,能够调制漏洞难度等级(低->中->高)。二、靶场搭建下载:https://sourceforge.net/projects/bwapp/2.1安装类型搭建类型有两种:(虚拟机版本可测试测漏洞类型更多,比如破壳、心脏滴血)独立安装(部署到apache+php+mysql环境下)虚拟机安装(bee

    2022年9月16日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号