首页 > 其他分享 >什么是死锁?

什么是死锁?

时间:2023-09-24 22:37:45浏览次数:45  
标签:独占 什么 死锁 活锁 线程 条件 等待

什么是死锁?

当线程 A 持有独占锁 a,并尝试去获取独占锁 b 的同时,线程 B 持有独占锁 b,并尝试获取独占锁 a 的情况下,就会发生 AB 两个线程由于互相持有对方需 要的锁,而发生的阻塞现象,我们称为死锁。

产生死锁的条件是什么?怎么防止死锁?

产生死锁的必要条件

  复制代码
 1、互斥条件:所谓互斥就是进程在某一时间内独占资源。 
 2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 
 3、不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。 
 4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。 理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、 预防和 解除死锁。

防止死锁可以采用以下的方法:

  scss 复制代码
 • 尽量使用 tryLock(long timeout, TimeUnit unit)的方法 (ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以 退出防止死锁。
 • 尽量使用 Java. util. concurrent 并发类代替自己手写锁。
 • 尽量降低锁的使用粒度,尽量不要几个功能用同一把锁。 
 • 尽量减少同步的代码块。

死锁与活锁的区别,死锁与饥饿的区别?

死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成 的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

活锁:任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝 试,失败,尝试,失败。 活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,这就是所谓的 “活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。

饥饿:一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执 行的状态。

Java 中导致饥饿的原因

  bash 复制代码
 1、高优先级线程吞噬所有的低优先级线程的 CPU 时间。 
 2、线程被永久堵塞在一个等待进入同步块的状态,因为其他线程总是能在它之 前持续地对该同步块进行访问。 
 3、线程在等待一个本身也处于永久等待完成的对象(比如调用这个对象的 wait 方法),因为其他线程总是被持续地获得唤醒。 

多线程锁的升级原理是什么?

在 Java 中,锁共有 4 种状态,级别从低到高依次为:无状态锁,偏向锁,轻量 级锁和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能 降级。

标签:独占,什么,死锁,活锁,线程,条件,等待
From: https://www.cnblogs.com/qdcream/p/17726826.html

相关文章

  • linux教程:cd $_与cd -有什么区别
    cd$_和cd-都是用于在命令行中切换工作目录的命令,但它们之间有一些区别。cd$_:$_是一个特殊变量,表示上一个执行命令的参数。在这种情况下,$_表示上一个命令的参数,即上一个cd命令所切换到的目录。因此,cd$_将切换到上一个命令所切换的目录。cd-:-(短横线)是一个特殊的目录名,表示前一个......
  • 什么是 JSON Web Token
    JSONWebToken(JWT),又称为JSON令牌,是一种用于在网络应用之间安全地传输信息的开放标准(RFC7519)。它采用了一种紧凑的、自包含的方式来表示信息,通常用于身份验证和授权。JWT的设计目标是确保信息的完整性和安全性,同时具备易于使用和传输的特点。JWT的结构JWT由三个部分组成,它们之......
  • 什么是外企中经常提到的 ad-hoc work
    Ad-hoc工作:何为、实例分析、重要性与应对策略Ad-hoc工作,这个术语在外企管理领域常常被提及,是一种灵活的、非结构化的工作方式。它通常用来应对突发性的任务、问题或需求,而不是按照预定计划或流程执行的工作。本文将深入探讨Ad-hoc工作的含义、重要性、实际案例以及有效应对策略,以......
  • 为什么@Resource无法注入泛型类型而@Autowired可以
    在Spring框架中,我们通常使用@Autowired和@Resource两个注解来实现属性注入。但是当涉及到泛型类型时,使用@Resource注解就会失败,而@Autowired可以正常工作。这篇文章就来分析它们之间的区别。@Autowired可以直接注入泛型类型,例如:```java@AutowiredprivateRepository<User>......
  • 20为什么进程通信会特别消耗资源?
     1.进程通信是指在多进程环境下,不同进程之间进行数据交换和共享的机制。虽然进程通信提供了一种有效的方式来实现并发和协作,但它确实会消耗一定的系统资源。以下是一些可能导致进程通信消耗资源的原因:1)上下文切换:在多进程环境中,当一个进程需要与另一个进程进行通信时,操作系统......
  • socks5代理服务器是什么?用什么检查socks5代理的效果行不行?
    随着互联网技术和科技的发展,在上网的时候使用代理ip的使用人数也越来越多,因为业务的需求需要使用socks5代理ip的应用范围越来越多,那么什么是socks5代理服务器?怎么检查socks5代理的效果好不好?接下来小编就给大家介绍一下:socks5代理服务器是什么意思某度解释是:采用socks协议的代理服......
  • Linux是什么?它与Windows有什么区别?
    前言本文将讲解Linux是什么、它的应用领域、未来、优缺点以及它与Windows的区别。一、Linux是什么?Linux是一种自由的、开放源码的类Unix操作系统。目前存在着许多不同的Linux系统,但它们都使用了Linux内核。Linux可安装在各种计算机设备中,从手机、平板电脑、路由器和视频游戏控制台,......
  • @TableField(exist = false)是什么作用
    @TableField(exist=false)是MyBatisPlus中的注解之一,用于指示该字段在数据库表中不存在,即告诉MyBatisPlus不进行与数据库的映射。默认情况下,MyBatisPlus会将实体类中的所有字段都映射到数据库表中的相应列。但是,有时候我们可能需要在实体类中定义一些非数据库字段或临时......
  • 为什么要学习python技术??
    大家好,随着大数据时代的到来,相信大家对新时代的认知达到了一个新的高度,我们可以仔细观察我们的生活,似乎每一年都会发生较大的变化。我记得我刚上大学的时候,移动支付才刚开始普及,短短几年,出门只需要一部手机便能行走天下,其中计算机编程起到了重要作用。 我们为什么要学......
  • crash —— 如何查看数据是什么类型以及函数原型
    在crash中可以用whatis命令查看数据类型信息以及函数的原型。如果想知道某个数据是什么类型那么可以用下面的方法:查看结构体的定义crash>whatismm_structstructmm_struct{struct{structmaple_treemm_mt;unsignedlong(*get_unmapped_area)(str......