造成死锁的原因:
1.在一个代码块中同时获得多个锁,导致多个线程同时执行代码时,获取锁之间相互依赖,从而导致锁“抱死”。例如,t1线程首先获得A锁,再获得B锁,t2线程先获得B锁,再获得A锁,当t1获得A锁的同时,t2获得了B锁的使用权,此时t1无法获取B锁,t2也无法获得A锁,线程一直等待,这就叫锁“抱死”。
2.在同步代码块中调用了外部的同步方法(常见)
下面我将结合实际情况分析账户转账时,发生死锁的代码示例。
针对第一种造成死锁的原因,嵌套多个synchronized同步。
首先建一个Account类,包括账户ID,账户名称,账户余额。
public class Account {
private int id;
private String accName;
private double balance = 100;
public Account(String name) {
this.accName = name;
}
public Account(int id,String name) {
this.id = id;
this.accName = name;
}
public int compareTo(double money){
if(balance > money){
return 1;
}else if(balance == money){
return 0;
}else{
return -1;
}
}
public void in(double money){
balance += money;
System.out.println(accName+"中的余额:"+balance);
}
public void out(double money){
balance -= money;
System.out.println(accName+"中的余额:"+balance);
}
/**
* @return the accName
*/
public String getAccName() {
return accName;
}
/**
* @param accName the accName to set
*/
public void setAccName(String accName) {
this.accName = accName;
}
/**
* @return the balance
*/
public double getBalance() {
return balance;
}
/**
* @param balance the balance to set
*/
public void setBalance(double balance) {
this.balance = balance;
}
/**
* @return the id
*/