死锁分析
1、死锁的产生
有以下代码,模拟的是两个账户之间的转账情况void transfer(Account from,Account to,int money){
from.setAmount(from.getAmount()-money);
to.setAmount(to.getAmount()+money);
}
单线程下,这段代码肯定没问题的,但在多线程下存在问题
现在对其加锁,加锁后的代码如下void transfer(Account from,Account to,int money){
synchronized(from){
synchronized(to){
from.setAmount(from.getAmount()-money);
to.setAmount(to.getAmount()+money);
}
}
}
synchronized,即对象锁,第一个synchronized锁住from对象,第二个synchronized锁住to对象。
多线程情况下 ,在同一时刻多个线程中仅有一个线程能拿到这个对象锁,对对象锁里面的代码段进行操作
但是加了对象锁之后,可能存在死锁!
transfer(a,b,100)和transfer(b,a,100)同时进行,即a向b转账的同时,b也在向a转账
【1】a向b转账,线程x拿到a这个对象锁
【2】b向a转账,线程y拿到b这个对象锁
操作【1】迫切需要b这个对象锁,才能进