死锁:指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信二造成的一种阻塞现象。在Java中其实就是因为线程之间由于争夺同步锁造成的。
下面代码为两个线程因等待对方的对象锁而产生死锁的程序:
public class 死锁{
public static void main(String args[]){
Object o1 = new Object() //创建对象o1
Object o2 = new Object() //创建对象o2
Thread t1 = new Thread(new T1(o1,o2));
Thread t2 = new Thread(new T2(o1,o2));//创建线程
t1.start();
t2.start();//开启线程
}
}
class T1 implements Runnable{ // 创建T1线程类
Object o1;
Object o2;
public T1(Object o1,Object o2){
super();
this.o1 = o1;
this.o2 = o2;
public void run(){
synchronized(o2){ //外层同步代码块
try{
Thread.sleep(200);
}catch(InterruptedException e){
e.printStackTrace();
}
synchronized(o1){ //某些执行代码块} //内层同步代码块
}
}
}
class T2 implements Runnable{ // 创建T2线程类
Object o1;
Object o2;
public T1(Object o1,Object o2){
super();
this.o1 = o1;
this.o2 = o2;
public void run(){
synchronized(o1){ //外层同步代码块
try{
Thread.sleep(200);
}catch(InterruptedException e){
e.printStackTrace();
}
synchronized(o2){//某些执行代码块} //内层同步代码块
}
}
}
死锁原理:
// T1类
synchronized(o2){ //线程t1执行到此获得o2的对象锁,然后往下执行
try{
Thread.sleep(200); //线程休眠,确保线程t2得到o1的对象锁(若t1先执行到此)
}catch(InterruptedException e){
e.printStackTrace();
}
synchronized(o1){//某些执行代码块} //执行到此,t1等待t2让出o1对象锁
}
//T2类
synchronized(o1){ //线程t2执行到此获得t1的对象锁,然后向下执行
try{
Thread.sleep(200);//线程休眠,确保线程t1得到o1的对象锁(若t2先执行到此)
}catch(InterruptedException e){
e.printStackTrace();
}
synchronized(o2){//某些执行代码块} //执行到此,t2等待t1让出o2对象锁
}
由以上可知,最终t1, t2线程都在等待对方的对象锁来执行后面的代码,而t1, t2在未执行完最外层同步代码块里的所有内容之前是不会让出的,故两线程始终等待,产生死锁