sleep() 和 wait() 的区别分析

sleep() 和 wait() 的区别

  1. sleep是线程中的方法,但是wait是Object中的方法。
  2. sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中。
  3. sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。
  4. sleep不需要被唤醒(休眠之后推出阻塞,他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态),但是wait需要(不指定时间需要被别人中断)。
sleep是线程中的方法,wait是Object中的方法

由 jdk 的源码中可以看出

  • sleep是线程中的方法
    在这里插入图片描述
  • wait是Object中的方法
    在这里插入图片描述
sleep不释放lock,wait会释放
  • sleep 不释放 lock 的验证代码:
    在这里插入图片描述
    运行结果:从下面结果中看到,线程2先获取了cpu资源,然后开始执行休眠,在休眠过程中线程1是没法执行的,必须要等待线程2结束之后才可以。这也就是说sleep方法不会释放锁,让其他线程进来。
    在这里插入图片描述
  • wait 释放 lock 的验证代码:
    在这里插入图片描述
    运行结果:从下面的结果中,线程2 wait ,线程1也可以 wait 操作,证明wait是释放了锁资源,让其他线程进来。
    在这里插入图片描述
sleep不依赖同步方法,wait需要
  • sleep 不依赖同步方法的验证代码:
    在这里插入图片描述
    运行结果:方法依次运行,不会出现任何异常。

  • wait 依赖同步方法的验证代码:
    在这里插入图片描述
    运行结果:方法依次运行,出现任何异常。
    在这里插入图片描述

sleep不需要被唤醒,wait需要
  • sleep 方法很简单,自己就会重新开始执行。
  • wait 方法的验证,定义一个等待方法,一个唤醒方法。
    在这里插入图片描述
    测试一下定义的方法:
    在这里插入图片描述
    运行结果:如果没有唤醒方法,那第一个线程就会处于一直等待的状态,第二个线程唤醒了之后就不再等待了。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值