public class Study extends Thread{
private Counter counter;
public Study(Counter counter){
this.counter=counter;
start();
}
@Override
public void run() {
for(int i=0;i<100;i++){
counter.add();
}
}
public static void main(String[] args) {
Counter counter1=new Counter();
Counter counter2=new Counter();
counter1.setFriend(counter2);
counter2.setFriend(counter1);
Study study1=new Study(counter1);
Study study2=new Study(counter2);
}
}
class Counter{
private int a;
private Counter friend;
public void setFriend(Counter counter){
this.friend=counter;
}
public synchronized void add(){
a++;
Thread.yield();
friend.delete();
System.out.println(Thread.currentThread().getName()+":add");
}
public synchronized void delete(){
a--;
System.out.println(Thread.currentThread().getName()+":delete");
}
}
分析:
首先study1线程进入run方法,获得counter1对象的锁,执行counter1的add方法,然后study1让出cpu执行权,则study2线程进入run方法,获得counter2对象的锁,执行counter2的add方法,之后study2让出cpu执行权,则study1进入运行状态,想执行counter2的delete方法,但是counter2对象锁已经被study2获得,而且如果后面study2线程进入运行状态,study2也要执行counter1delete方法,但是counter1对象锁已经被study1获得,这样就是导致了死锁。