在面试中经常性的遇到wait和sleep的区别?

1.sleep不会释放锁 ,而wait会释放锁 

    private static final String LOCK = "lock";public static void main(String[] args) {new Thread(() -> {System.out.println(Thread.currentThread().getName() + "====start");test();System.out.println(Thread.currentThread().getName() + "====end");}).start();new Thread(() -> {System.out.println(Thread.currentThread().getName() + "====start");test();System.out.println(Thread.currentThread().getName() + "=====end");}).start();}public static void test() {synchronized (LOCK) {System.out.println(Thread.currentThread().getName() + "====getLock" + System.currentTimeMillis());try {LOCK.wait(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "====unLock" + +System.currentTimeMillis());}}Thread-0====start
Thread-0====getLock1603173719697
Thread-1====start
Thread-1====getLock1603173719697
Thread-1====unLock1603173724698
Thread-1=====end
Thread-0====unLock1603173724698
Thread-0====end
    private static final String LOCK = "lock";public static void main(String[] args) {new Thread(() -> {System.out.println(Thread.currentThread().getName() + "====start");test();System.out.println(Thread.currentThread().getName() + "====end");}).start();new Thread(() -> {System.out.println(Thread.currentThread().getName() + "====start");test();System.out.println(Thread.currentThread().getName() + "=====end");}).start();}public static void test() {synchronized (LOCK) {System.out.println(Thread.currentThread().getName() + "====getLock" + System.currentTimeMillis());try {Thread.sleep(4321L);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "====unLock" + +System.currentTimeMillis());}}
Thread-0====start
Thread-1====start
Thread-1====getLock1603173961122
Thread-1====unLock1603173965444
Thread-1=====end
Thread-0====getLock1603173965444
Thread-0====unLock1603173969765
Thread-0====end

2.由上面的代码 我们发现sleep方法是通过Thead的静态方法 而wait是Object对象的方法

3.我们将同步块去掉 会发现sleep方法会正常使用,而wait方法会出错(wait必须依赖同步块

    public static void test() {System.out.println(Thread.currentThread().getName() + "====getLock" + System.currentTimeMillis());try {LOCK.wait(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "====unLock" + +System.currentTimeMillis());}Thread-0====start
Thread-1====start
Thread-1====getLock1603174303023
Thread-0====getLock1603174303023
Exception in thread "Thread-1" Exception in thread "Thread-0" java.lang.IllegalMonitorStateExceptionat java.lang.Object.wait(Native Method)at com.zexiang.java.sync.reentrantsync.T.test(T.java:31)at com.zexiang.java.sync.reentrantsync.T.lambda$main$0(T.java:17)at java.lang.Thread.run(Thread.java:745)
java.lang.IllegalMonitorStateExceptionat java.lang.Object.wait(Native Method)at com.zexiang.java.sync.reentrantsync.T.test(T.java:31)at com.zexiang.java.sync.reentrantsync.T.lambda$main$1(T.java:22)at java.lang.Thread.run(Thread.java:745)

4.sleep必须设置时间 而wait则可以都可以 。如果不给时间参数必须要唤醒LOCK.notify();

                Thread.sleep(1000);LOCK.wait(1000);LOCK.wait();

最新文章

  1. 如何解决两个相邻的span中间空隙
  2. linux在芯片设计与实现,基于Linux的Atheros无线芯片网卡驱动的设计与实现
  3. idea(mac) 使用收集
  4. 蓝桥杯——黑色星期五
  5. SpringBoot 2.0 系列005 --启动实战之SpringApplication应用
  6. 新主播如何在直播行业混得好
  7. 联想拯救者 Lenovo Legion 通电自启 插电自启 通电开机 插电开机 Wake on AC
  8. java虚拟机与安卓虚拟机的区别
  9. 【shiro基础】springboot + shiro整合thymeleaf
  10. php微信公众点歌台,PHP实现微信公众平台音乐点播功能
  11. angular学习-数据绑定
  12. VSS2005的配置
  13. .net core with 微服务 - Polly 熔断降级
  14. 小姐姐都在用的25+技术站点
  15. 函数嵌套的定义与调用:
  16. 使用LabVIEW 实现物体识别、图像分割、文字识别、人脸识别等深度视觉
  17. 小程序毕业设计 基于微信棋牌室小程序毕业设计开题报告功能参考
  18. 用VMware-workstation虚拟苹果雪豹操作系统遇到的问题
  19. 科技多元化:基于 HTML5 WebGL 的无人机 3D 可视化系统
  20. HTC终端4G网络附着问题

热门文章

  1. 解决未能加载文件或程序集“Newtonsoft.Json ....“或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
  2. 笔记本连接蓝牙未能成功安装设备驱动程序怎么办
  3. 短网址是什么,短网址有哪些应用场景,如何使用长网址转短网址
  4. 微信小程序连接华为云ModelArts的方法以及一些小坑(二)
  5. 奥比中光Orbbec Astra Pro RGBD 3D视觉传感器在ROS(indigo和kinetic)使用说明 rgb depth同时显示
  6. Python快速入门,附详细视频教程
  7. 提升移动设备响应式设计的8个建议
  8. java cron表达式 每天凌晨两点_spring配置定时任务设置为每天凌晨2点执行和每小时执行一次如何配置。...
  9. 使用Application 上传iOS App
  10. nginx设置只允许蜘蛛访问其他访问为404或者301跳转