网站首页 > 数据编程 正文
线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。
1.互斥条件:进程对于所分配到的资源具有排它性,即一个资源只能被一个进程占用,直到被该进程释放
2.请求和保持条件:一个进程因请求被占用资源而发生阻塞时,对已获得的资源保持不放。
3.不剥夺条件:任何一个资源在没被该进程释放之前,任何其他进程都无法对他剥夺占用 。
4.循环等待条件:当发生死锁时,所等待的进程必定会形成一个环路(类似于死循环),造成永久阻塞。
避免死锁:
在有些情况下死锁是可以避免的。本文将展示三种用于避免死锁的技术:
1.加锁顺序当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生。如果一个线程(比如线程3)需要一些锁,那么它必须按照确定的顺序获取锁。它只有获得了从顺序上排在前面的锁之后,才能获取后面的锁。
2.加锁时限
另外一个可以避免死锁的方法是在尝试获取锁的时候加一个超时时间,这也就意味着在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求。若一个线程没有在给定的时限内成功获得所有需要的锁,则会进行回退并释放所有已经获得的锁,然后等待一段随机的时间再重试。这段随机的等待时间让其它线程有机会尝试获取相同的这些锁,并且让该应用在没有获得锁的时候可以继续运行
3.死锁检测死锁检测是一个更好的死锁预防机制,它主要是针对那些不可能实现按序加锁并且锁超时也不可行的场景。每当一个线程获得了锁,会在线程和锁相关的数据结构中(map、graph等等)将其记下。除此之外,每当有线程请求锁,也需要记录在这个数据结构中。
【全文完】
猜你喜欢
- 2024-11-09 「每天一道面试题」Mysql死锁解决
- 2024-11-09 死锁Deadlock内测资格怎么拿,获取内测资格教程来了
- 2024-11-09 死锁Deadlock崩溃,无法启动怎么处理
- 2024-11-09 图解Java中的锁:什么是死锁?怎么排查死锁?怎么避免死锁?
- 2024-11-09 「C#.NET 拾遗补漏」12:死锁和活锁的发生及避免
- 2024-11-09 死锁详解:常见死锁案例、条件,如何避免出现死锁?
- 2024-11-09 死锁下载不了/下载慢/下载报错/无法下载的解决办法分享
- 2024-11-09 数据库死锁排查思路分享引言 数据库死锁查询命令
- 2024-11-09 MySql死锁问题如何排查 mysql死锁的情况
- 2024-11-09 死锁Deadlock匹配不到人,匹配失败解决方法在这
- 最近发表
- 标签列表
-
- oraclepdb (60)
- vncviewermac (62)
- sqlservermax (58)
- mysqlcanal (61)
- mysql:commandnotfound (56)
- mysqlexplainfiltered (56)
- python位运算符 (59)
- linuxfind-name模糊查询文件 (60)
- centos7systemctl (76)
- mysqlgt (55)
- nc命令 (66)
- dockerfilecp (55)
- 单行子查询返回多个行解决办法 (58)
- ssh-2.0-openssh_7.4 (56)
- vue图片裁剪 (59)
- anyvideoconverterpro (62)
- pscache (58)
- hdfsfsck (63)
- nacos源码 (69)
- lambdawrapper (60)
- 安装jdk11 (60)
- 什么是聚簇索引 (62)
- 锁升级过程 (58)
- bootcdn (64)
- axurerp9mac破解版 (58)