一个Java死锁代码

死锁:指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信二造成的一种阻塞现象。在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在未执行完最外层同步代码块里的所有内容之前是不会让出的,故两线程始终等待,产生死锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值