多线程死锁问题
死锁的定义
死锁:是操作系统或软件运行的一种状态:在多任务系统下,当一个或多个进程等待系统资源,而资源又被进程本身或其它进程占用时,就形成了死锁。
A、B两个线程同时抢占M、N两个资源,当A线程访问M资源时加了一把锁,然后再去访问N资源,但是同一时刻B线程在N资源上加了一把锁,B又要去拿M资源。
附上代码:
class BThread extends Thread{
String name; //人名、线程名
public BThread(String name) {
super();
this.name = name;
}
@Override
public void run() {
if (name.equals("小明")) {
synchronized ("刀") {
System.out.println("小明抢到刀了,准备去抢叉子");
synchronized ("叉子") {
System.out.println("小明又抢到叉子了,可以开动了");
}
}
}else {
synchronized ("叉子") {
System.out.println("小红抢到叉子了,准备抢刀");
synchronized ("刀") {
System.out.println("小红抢到刀,开动");
}
}
}
}
}
死锁产生的条件
- 多个线程。
- 多个线程都需要相同的两个及以上的临界资源。
- 两个线程,每个线程都获取了其中的一个锁,但为了完成工作,还需对方的另一个锁。这种情况下,才会产生死锁。这种情况也称为循环等待。
- 不可剥夺。需等对方主动释放。
如何避免死锁
- 加锁顺序
- 加锁时限:线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁。
- 死锁检测
这是我学习多线程死锁时的一些了解,还有很多不足。