第九篇:死锁(含代码)
来源:互联网 发布:usb转232数据接口驱动 编辑:程序博客网 时间:2024/05/16 07:45
当线程需要同时持有多个锁时,有可能产生死锁。考虑如下情形:
线程A当前持有互斥所锁lock1,线程B当前持有互斥锁lock2。接下来,当线程A仍然持有lock1时,它试图获取lock2,因为线程B正持有lock2,因此线程A会阻塞等待线程B对lock2的释放。如果此时线程B在持有lock2的时候,也在试图获取lock1,因为线程A正持有lock1,因此线程B会阻塞等待A对lock1的释放。二者都在等待对方所持有锁的释放,而二者却又都没释放自己所持有的锁,这时二者便会一直阻塞下去。这种情形称为死锁。
下面给出一个两个线程间产生死锁的示例,如下:
运行结果如下:
从结果中可以看出,在执行到other.action()时,由于两个线程都在试图获取对方的锁,但对方都没有释放自己的锁,因而便产生了死锁,在主线程中试图中断两个线程,但都无果。
大部分代码并不容易产生死锁,死锁可能在代码中隐藏相当长的时间,等待不常见的条件地发生,但即使是很小的概率,一旦发生,便可能造成毁灭性的破坏。避免死锁是一件困难的事,遵循以下原则有助于规避死锁:
1、只在必要的最短时间内持有锁,考虑使用同步语句块代替整个同步方法;
2、尽量编写不在同一时刻需要持有多个锁的代码,如果不可避免,则确保线程持有第二个锁的时间尽量短暂;
3、创建和使用一个大锁来代替若干小锁,并把这个锁用于互斥,而不是用作单个对象的对象级别锁;
阅读全文
0 0
- 第九篇:死锁(含代码)
- Java并发编程(9):死锁(含代码)
- 【Java并发编程】之九:死锁(含代码)
- 【Java并发编程】之九:死锁(含代码)
- 【Java并发编程】之九:死锁(含代码)
- 【Java并发编程】之九:死锁(含代码)
- 【Java并发编程】之九:死锁(含代码)(r)
- 【Java并发编程】之九:死锁(含代码)
- Java并发编程之十一:死锁(含代码)
- 第六篇:JAVA网络编程之TCP Socket通信中由read返回值造成的的死锁问题(含代码)
- 第十篇:深入剖析socket——TCP通信中由于底层队列填满而造成的死锁问题(含代码)
- 资源分配之银行家算法(含随机调度算法C++代码,此银行家算法,没考虑死锁的发生)
- 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)
- 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)
- 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)
- 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)
- 第二篇:线程中断(含代码)
- 操作系统 第九章 死锁
- gcc 编译选项 及其 详解
- zigbee发送功率设置及发送距离过短解决方案
- 【思维】hdu 4324 Triangle love
- lightoj 1023
- bootstrap-multiselect下拉列表
- 第九篇:死锁(含代码)
- 之前运行的还好好的,现在突然就不行了
- 网页下滑到底部之后加载更多
- Spring AOP相关术语
- FE1.1,FE1.1代理,台湾汤铭,USB2.0HUB方案,中文说明,牛叉价格
- Kotlin入门(15)独门秘笈之特殊类
- 装饰模式
- HDU-2444-The Accomodation of Students [二分匹配][判断二分图][BFS染色法]
- 垂直细分的暴利行业,巧妙地营销手段!