首页 > 其他分享 >wait、notify、notifyAll的理解与使用

wait、notify、notifyAll的理解与使用

时间:2024-12-30 23:30:18浏览次数:5  
标签:调用 notifyAll 线程 notify 方法 wait

基础知识
Java 中,可以通过配合调用 Object 对象的 wait() 方法和 notify() 方法或 notifyAll() 方法来实现线程间的通信。
在线程中调用 wait() 方法,将阻塞当前线程,直至等到其他线程调用了调用 notify() 方法或 notifyAll() 方法进行通知之后,当前线程才能从 wait() 方法出返回,继续执行下面的操作。

wait
该方法用来将当前线程置入休眠状态,直到接到通知或被中断为止。在调用 wait()之前,线程必须要获得该对象的对象监视器锁,即只能在同步方法或同步块中调用 wait()方法。调用 wait()方法之后,当前线程会释放锁。如果调用 wait()方法时,线程并未获取到锁的话,则会抛出 IllegalMonitorStateException异常,这是一个 RuntimeException。如果再次获取到锁的话,当前线程才能从 wait()方法处成功返回。

notify
该方法也要在同步方法或同步块中调用,即在调用前,线程也必须要获得该对象的对象级别锁,如果调用 notify()时没有持有适当的锁,也会抛出 IllegalMonitorStateException。
该方法任意从 WAITTING 状态的线程中挑选一个进行通知,使得调用 wait()方法的线程从等待队列移入到同步队列中,等待有机会再一次获取到锁,从而使得调用 wait()方法的线程能够从 wait()方法处退出。调用 notify 后,当前线程不会马上释放该对象锁,要等到程序退出同步块后,当前线程才会释放锁。

notifyAll
该方法与 notify ()方法的工作方式相同,重要的一点差异是:
notifyAll 使所有原来在该对象上 wait 的线程统统退出 WAITTING 状态,使得他们全部从等待队列中移入到同步队列中去,等待下一次能够有机会获取到对象监视器锁。

wait()与notify()操作会释放锁吗?
先说结论:
wait()会立即释放对象的锁
notify() 不会立即释放锁 当执行完同步代码块就会释放对象的锁

原文链接:https://blog.csdn.net/lizhengze1117/article/details/106342359

标签:调用,notifyAll,线程,notify,方法,wait
From: https://www.cnblogs.com/tzzp/p/18642705

相关文章

  • C# async void 方法中使用await不会异步等待
    asyncvoid通常用于事件处理程序或其他不需要返回值的情况,好像是一个为了解决历史遗留问题创建的机制,非必要情况下,不建议使用asyncvoid,推荐使用asyncTask替代asyncvoid和主线程貌似是一个线程,如果asyncvoid中存在异步等待时,执行到await时,会在等待的同时切换到其他线程(主线......
  • Go 并发之WaitGroup,并发锁,Context
    目录1Go并发1.1WaitGroup1.2并发锁1.2.1互斥锁1.2.2读写互斥锁1.2.3sync.Once1.2.4sync.Map1.3Context1.3.1简介1.3.2主要功能1.3.3使用示例1.3.3.1取消信号1.3.3.2设置超时1.3.3.3传递值1Go并发1.1WaitGroupsync.WaitGroup是Go标准库提供的一种同步原语,常......
  • 【WPF】INotifyCollectionChanged 、INotifyPropertyChanged 以及实现了二者的Observa
    INotifyCollectionChanged在WPF中,INotifyCollectionChanged是一个接口,用于实现集合(如列表)变化时通知UI更新的机制。这个接口特别常用于数据绑定中,尤其是当集合的内容发生变化时,WPF能够自动更新绑定的UI组件。1.接口概述INotifyCollectionChanged是.NET中System.Collectio......
  • Android Studio使用Flutter拉取依赖出现Waiting for another flutter command to rele
    Waitingforanotherfluttercommandtoreleasethestartuplock...意思就是等待释放锁,通过Waitingforanotherfluttercommandtoreleasethestartuplock这些方法依旧不行。还是会出现,无论是kill掉dart进程、删除localfile文件还是重启电脑,都没有解决这个问题。最后我......
  • MySQL for update skip locked 与 for update nowait
    理论(下方有实操)forupdateskiplocked官方文档:https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html#innodb-locking-reads-for-update语法:select语句后跟forupdateskiplocked作用:目标对象没有被其它会话加锁则可加锁,被其它会话加了锁就跳过。解决问题:......
  • async 与 await
    async和await是用于编写异步代码的关键字,允许程序在执行I/O操作(如网络请求、文件读写等)时不阻塞其他代码的执行。这样可以提高程序的并发性能,使其在处理多个任务时更加高效。async用于定义一个异步函数(协程),而await用于暂停协程的执行,等待某个耗时操作完成。通过这种方式,......
  • Go 并发控制:sync.WaitGroup 详解 GoCN 2024年12月24日 16:37 浙江 听全文
    Go并发控制:sync.WaitGroup详解GoCN  2024年12月24日16:37 浙江 听全文 以下文章来源于Go编程世界 ,作者江湖十年Go编程世界.不限于Golang、Docker、Kubernetes,技术博客https://jianghushinian.cn/的移动版。前段时间我在《Go并发控制:errgroup详解》......
  • ES6 async await只能保证async内部顺序调用顺序
    ES6asyncawait只能保证async内部顺序调用顺序引言基本概念与作用说明Async函数Await运算符内部操作顺序调用顺序示例一:简单的async函数示例二:多个async函数的调用示例三:控制调用顺序示例四:并行与顺序结合示例五:错误处理不同角度的功能使用思路API请求管理数据预加载......
  • 解决Ubuntu安装git时遇到的进程占用和waiting for cache lock: Could not get lock /v
    系统版本:Ubuntu20.04.2.0在安装git时,使用sudoaptinstallgit,却有以下提示:即出现waitingforcachelock:Couldnotgetlock/var/lib/dpkg/lock-frontend的问题查阅资料,有人提出使用kill9进程号这里我使用 kill99021提示bash:kill:(9)-Nosuchprocess......
  • GO:同步工具WaitGroup
    什么是WaitGroup?WaitGroup是Go的标准库sync包中提供的一种并发控制工具,用于等待一组goroutine完成工作。它非常适合在主线程需要等待一组goroutine全部完成时使用。通俗解释可以把WaitGroup想象成一个计数器:启动任务时:给计数器加1。任务完成时:给计数器减1。......