java线程死锁

java通过synchronized关键字包装代码块、方法或通过Lock、ReadWriteLock锁的机制来实现多线程并发同步操作,但是使用不当,会造成死锁!
下面写一个案例

先定义两个执行实体类

public class First {
    public synchronized void foo(Second second){
        System.out.println("当前线程名:" + Thread.currentThread().getName() + "进入了First实例的foo方法");
        try {
            Thread.sleep(200);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("当前线程名:" + Thread.currentThread().getName() + " 企图调用Second实例的last方法");
        second.last();
    }

    public synchronized void last(){
        System.out.println("进入了First实例的last方法内部");
    }
}


public class Second{
    public synchronized void bar(First first) {
        System.out.println("当前线程名:" + Thread.currentThread().getName()
                + "进入了Second实例的bar方法");
        try {
            Thread.sleep(200);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("当前线程名:" + Thread.currentThread().getName()
                + "企图调用First实例的last方法");
        first.last();
    }

    public synchronized void last() {
        System.out.println("进入了Second类的last内部");
    }
}

编写启动调用类
public class DeadLock implements Runnable {
    First first = new First();
    Second second = new Second();
    public void init(){
        Thread.currentThread().setName("主线程");
        first.foo(second);
        System.out.println("进入了主线程之后");
    }

    public void run() {
        Thread.currentThread().setName("副线程");
        second.bar(first);
        System.out.println("进入副线程之后");
    }

    public static void main(String[] args){
        DeadLock lock = new DeadLock();
        new Thread(lock).start();
        lock.init();
    }
}

然后运行DeadLock的main方法,实现效果如下:
这里写图片描述
线程执行到画线部分戛然而止,而且虚拟机永不停止(图中画方框处),此时就造成了死锁,程序不停止,也不报错,所有线程都想被阻塞!

如下图解实现过程
这里写图片描述
心得:在多线程调用中,合理利用synchronized,和Lock,合理使用wait() 和 notify()、notifyAll()来进行线程间的通信协作。避免造成死锁!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值