看了一下线程这方面的知识,也结合了一些 面试的题 总结如下:

一些基础的就不说了,主要说一下这里面的几个方法,也是object的通用方法。

sleep()     wait()     notify/notifyAll()   的区别

sleep()是线程类的方法,sleep() 允许指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,指定的时间一过,线程重新进入可执行状态。说白了 ,也就是把机会给其他线程,但是监控状态依然保持。重要的一点就是 当调用sleep()方法是 不会 释放对象锁的。

下面详细讲一下 : wait()     notify/notifyAll()   的区别

先来谈谈为什么所有的类中都有这一对方法,看是很奇怪,其实是 Thread类提供的,但是这一对却直接隶属于 Object 类,也就是说,所有对象都拥有这一对方法。因为这一对方法阻塞时要释放占用的锁,而锁是任何对象都具有的,调用任意对象的 wait() 方法导致线程阻塞,并且该对象上的锁被释放。

notify()是释放对象的wait()方法而阻塞线程(但是也要当得到锁后才可以运行)但是这个释放是随机的,也就是不一定要释放那个线程。(因为调用同一资源的可能不是一个线程或者说是有多个阻塞的线程在等待,但是如果加了synchronized也只有一个线程,也有其他的线程在等待中,也就是阻塞)我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。

除了 notify(),还有一个方法 notifyAll() 也可起到类似作用,唯一的区别在于,调用 notifyAll() 方法将把因调用该对象的 wait() 方法而阻塞的所有线程一次性全部解除阻塞。当然,只有获得锁的那一个线程才能进入可执行状态。

但是这一对方法却必须在 synchronized 方法或块中调用,理由也很简单,只有在synchronized 方法或块中当前线程才占有锁,才有锁可以释放。

  同样的道理,调用这一对方法的对象上的锁必须为当前线程所拥有,这样才有锁可以释放。因此,这一对方法调用必须放置在这样的 synchronized 方法或块中,该方法或块的上锁对象就是调用这一对方法的对象(synchronized 方法用this.wait(),synchronized(obj)用obj.wait())。若不满足这一条件,则程序虽然仍能编译,但在运行时会出现 IllegalMonitorStateException 异常。

谈到阻塞,就不能不谈一谈死锁,略一分析就能发现,suspend() 方法和不指定超时期限的 wait() 方法的调用都可能产生死锁。遗憾的是,Java 并不在语言级别上支持死锁的避免,我们在编程中必须小心地避免死锁。

转载于:https://blog.51cto.com/jianshusoft/652416

sleep() wait() notify/notifyAll() 的区别相关推荐

  1. android notify() notifyAll()的区别

    notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法. void notify(): 唤醒一个正在等待该对象的线程. void notifyAll(): 唤醒 ...

  2. Java中notify和notifyAll的区别 - 何时以及如何使用

    Java  notify   vs notifyAll notify和notifyAll方法之间有什么区别是棘手的Java问题之一! Condition 是个什么玩意? 提几个问题,从问题中去了解去学 ...

  3. notify 和 notifyAll的区别

    6.notify 和 notifyAll的区别 notify方法只唤醒一个等待(对象的)线程并使该线程开始执行.所以如果有多个线程等待一个对象,这个方法只会唤醒其中一个线程,选择哪个线程取决于操作系统 ...

  4. Notify与notifyall的区别

    Notify与notifyall的区别 notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争. notify则文 ...

  5. java notify什么意思_Java notify和notifyAll的区别和相同

    经常在往上逛,关于在java中notify和notifyAll,经常有人有以下的说法: notify只会通知一个在等待的对象,而notifyAll会通知所有在等待的对象,并且所有对象都会继续运行 并且 ...

  6. 终于搞懂了sleep/wait/notify/notifyAll

    作者:acupt,专注Java,架构师社区合伙人! sleep/wait/notify/notifyAll分别有什么作用?它们的区别是什么?wait时为什么要放在循环里而不能直接用if? 简介 首先对 ...

  7. wait/notify/notifyAll在Object类中

    wait/notify/notifyAll在Object类中 因为我们在使用synchronized锁 对象锁可以是任意对象,所以wait/notify/notifyAll需要放在Object类中. ...

  8. 线程的状态转换、sleep()、wait()、yeild()、终止线程的方法、线程之间的协作(join()、wait() notify() notifyAll()、await() signal() )

    1.线程的状态转换 1.1 新建(New) 创建后尚未启动 1.2 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片. 包含了操作系统线程状态中的 Running 和 Read ...

  9. wait/notify/notifyall 基本概念

    wait:表示持有对象锁的线程A准备释放对象锁权限,释放cpu资源并进入等待状态. notify:表示持有对象锁的线程A准备释放对象锁权限,通知jvm唤醒某个竞争该对象锁的线程X.线程A synchr ...

最新文章

  1. python pytest_Python项目的pytest初始化
  2. 输入设备配置文件(.idc文件)
  3. Android内存管理机制详解,【安卓知识普及贴】之关于安卓内存管理机制的一些介绍和阐述。...
  4. go 分段锁ConcurrentMap,map+读写锁,sync.map的效率测试
  5. jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
  6. Python的特殊成员
  7. 同网关劫持与不同网关劫持实例
  8. Linux NFS 服务部署
  9. 将Word文档转换成PPT教程
  10. RGB色彩模式-最广的颜色系统之一
  11. 2011ACM大赛题目之贪吃蛇算法
  12. CI、CD、Pipeline 概念
  13. nas android 开源,五大开源NAS项目盘点
  14. 阿里云创建AccessKey
  15. 洛谷 P2071 座位安排 seat.cpp/c/pas
  16. Chrome Extension 小试牛刀
  17. 【全国计算机等级考试二级教程——C语言程序设计(2021年版)编程题答案-第8章】
  18. 搭建DHCP服务和NTP网络时间同步
  19. 手把手教你开发人工智能微信小程序(1):线性回归模型
  20. 【内排序 -- 八大排序】

热门文章

  1. 初识Tcl(五):Tcl 循环
  2. pyhon 数据类型转换函数
  3. 眉目传情之匠心独运的kfifo【转】
  4. 思考Web应用的数据流
  5. 写给刚入门的前端工程师的前后端交互指南
  6. PHP服务器时间差8小时解决方案
  7. 继续说说美国互联网版权监管法案(SOPA)
  8. linux内核第一个函数,通过内核源码看函数调用之前世今生 - 极光 - CSDN博客
  9. 低通采样和带通采样定理
  10. 二极管7种应用电路详解之五