java基础--死锁、线程状态

目录

1.死锁

1.什么是死锁

2.死锁产生的条件

3.代码演示

2.线程状态

1.线程状态说明

2.线程状态转换图

 3.等待唤醒机制


1.死锁

1.什么是死锁

        多个线程需要多个锁的时候,不同线程抢到了不同的锁,每个线程不愿释放已获取的锁,同时等待其他线程释放锁,导致了线程互相等待,称之为死锁。

2.死锁产生的条件

        要有多个锁。

        要有多个线程。

        不同线程获取到了不同的锁。

3.代码演示

public static void main(String[] args) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    synchronized ("第一把锁") {
                        System.out.println("线程一获取到了第一把锁");
                        synchronized ("第二把锁") {
                            System.out.println("线程一获取到了第二把锁");
                            System.out.println("线程一把门打开了!!!");
                        }
                    }
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    synchronized ("第二把锁") {
                        System.out.println("线程二获取到了第二把锁");
                        synchronized ("第一把锁") {
                            System.out.println("线程一获取到了第一把锁");
                            System.out.println("线程二把门打开了!!!");
                        }
                    }
                }
            }
        }).start();
    }

        执行结果

线程一获取到了第一把锁
线程一获取到了第二把锁
线程一把门打开了!!!
线程一获取到了第一把锁
线程一获取到了第二把锁
线程一把门打开了!!!
线程一获取到了第一把锁
线程一获取到了第二把锁
线程一把门打开了!!!
线程一获取到了第一把锁
线程一获取到了第二把锁
线程一把门打开了!!!
线程一获取到了第一把锁
线程二获取到了第二把锁

        这种情况下,有可能线程一将第一把锁和第二把锁都拿到开门,也有可能线程二将两把锁都拿到开门,还有可能线程一和线程二分别拿到一把锁,这个时候就进入到了死锁状态。

2.线程状态

1.线程状态说明

NEW:新建状态

Runnable:可运行状态

Blocked:锁阻塞状态

Waiting:无限等待状态

Timed Waiting:计时等待状态

Terminated:终止状态

2.线程状态转换图

 3.等待唤醒机制

Object类中有两个方法:

wait()        :让当前线程进入等待状态
notify()      :唤醒一个正在等待的线程

注意事项:这两个方法必须使用同步锁对象来调用。

  • 两个方法的小疑问
    • 两个方法必须写在同步里面吗?

      是,因为必须用锁对象来调用,同步里面才有同步锁。

    • 为什么两个方法定义在Object类中而不是线程Thread类中?

      因为方法是需要同步锁对象来调用的,而锁对象可以是任意类型对象,也就是说任意对象都可能调用这个方法。

  • wait()等待和sleep()睡眠的区别:

    sleep()方法抱着锁睡觉

    wait()方法释放锁等待

以上就是部分死锁与线程状态的知识点啦,后续会继续补充。各位大佬如发现有知识点错误或者有不同的建议与意见,欢迎评论、私信指正,本人才疏学浅还需向各位大佬学习,还请不吝赐教!在此感谢各位的观看!谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值