死锁
来源:互联网 发布:手机进入网络管理网址 编辑:程序博客网 时间:2024/06/03 18:48
锁顺序死锁
当两个线程试图以两种方式来获取相同的锁
thread-1:synchronized (lock1){ synchronized (lock2){ // ... }}thread-2:synchronized (lock2){ synchronized (lock1){ // ... }}
动态的锁顺序的死锁
函数参数不同,获取锁的顺序也不同
可通过方法内比较参数决定执行顺序解决死锁
private void fun(Object lock1, Object lock2) { synchronized (lock1){ synchronized (lock2){ // ... } } }
相互协作对象操作死锁
class A{ B b; public synchronized void fun1(){}; /** * 先获取A对象的锁,再获取B对象的锁 */ public synchronized void fun2(){ b.fun2(); }; } class B{ A a; /** * 先获取B对象的锁,再获取A对象的锁 */ public synchronized void fun1(){ a.fun1(); }; public synchronized void fun2(){}; }
解决方法:公开调用,使用拷贝对象或者缩小持有锁的范围,避免死锁的产生,弊端是破坏了操作的原子性
/** * 先获取A对象的锁,再获取B对象的锁 */ public void fun2(){ synchronized (this){ // .. clone c=b; } c.fun2(); };
资源死锁
争抢资源而得不到满足,产生死锁。
定时锁解决死锁
采用显式重入锁代替内置锁,可设置超时处理
0 0
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- 死锁
- java之jvm学习笔记十三(jvm基本结构)
- 使用Ide实现远程调试
- SQL数据库SQLite
- fir.im Weekly - TouchBar 从入门到开发
- iOS 获取网页源码
- 死锁
- Beetl学习总结(2)——基本用法
- 注解解释
- android音量的控制曲线的计算方法
- 集成微信登录和分享真的很简单
- 安卓String中设置多个占位符
- 插入Charging 时屏幕点亮问题
- java反射中method类中的invoke方法是做什么的,他有什么作用?
- WaitForSingleObject函数的使用