- 产生死锁的四个条件
1.要有锁
2.要有拿了一个锁的同时又等待另一个锁
3.循环等待
4.无限等待 - 产生死锁的一段代码,银行转账
void transfer(Account from,Account to,int amount){
synchronized(from){
synchronized(to){
//减钱
from.setAmount(from.getAmount-amount);
//加钱
to.setAmount(from.getAmount+amount);
}
}
}
当上面的代码在两个线程中执行时
A线程执行 transfer(userA,userB,100);
B线程执行 transfer(userB,userA,100);
可能会发生死锁的情况,死锁发生在
当A线程在锁住userA的时候 B线程同时锁住了userB
然后当A线程去锁userB的时候发生等待,此时B线程也去锁userA,出现死锁。
解决办法:
1.消除循环等待,
按照用户的id的先后顺序去锁住用户对象,让其不出现循环等待
即:修改代码如下
void transfer(Account from,Account to,int amount){
Account temp1;
Account temp2;
if(from.getId>to.getId){
temp1=from;
temp2=to;
}else{
temp1=to;
temp2=from;
}
synchronized(temp1){
synchronized(temp2){
//减钱
from.setAmount(from.getAmount-amount);
//加钱
to.setAmount(from.getAmount+amount);
}
}
}
2.设立超时机制(用户体验不友好)
3.其他方式(待研究)
网友评论