博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java wait()和await() notify()和signal() notifyAll()和signalAll()了解和区别
阅读量:2441 次
发布时间:2019-05-10

本文共 1117 字,大约阅读时间需要 3 分钟。

Java wait()和await() notify()和signal() notifyAll()和signalAll()了解和区别

wait()、notify()和notifyAll()一般是跟synchronized配合一起使用,这些方法都是Object类提供的。当线程重wait()状态下被唤醒,wait()在被唤醒后还需要重新去获取锁,此时它重新请求锁时并没有具备任何特殊的优先级,要与任何其他尝试进入同步代码块的线程一起去竞争获取锁,如果获取锁失败的话,会继续停留在当前的wait()方法状态下。所以wait方法继续执行时,一般会先通过一个条件判断,所以一般是在一个循环中去调用wait()方法。例如:

pubic syncronized T get() throws InterruptedException{     while(isEmpty){         wait();     }     T t = doGet();     notifyAll();     return t;}
由于多个线程可以基于不同的条件在同一个条件队列中等待,所以一般是条用notifyAll(),避免造成消息的丢失。因为调用notify()只会唤醒一个线程,但是这个线程可能并不能从满足条件,这个时候系统其它线程满足条件会一直等待并无法被唤醒,这是一个非常危险的操作。所以一定要使用notifyAll()。

那么什么情况下使用notify()呢?

当满足(1)所有线程的wait()前置判断条件只有一个并且都是一样的(2)单进单出,每次通知发出后,这个条件下最多只有一个线程可以去执行。

Condition类的await()、signal()和signalAll(),一般是配合Lock一起使用,是显式的线程间协调同步操作类。每个Lock中可以有多个Condition,如notEmpty、notFull等。这些方法都是在某个具体的Condition条件队列中调用,唤醒的时候也是类似,使用对应的Condition来唤醒一个或者多个等待的线程。和wait()、notify()类似,使用这些方法时也需要先通过Lock获取锁,await()方法同样会释放锁,并挂起当前线程,等待被通知唤醒去重新竞争锁。

怎么选择?

一般情况下使用Object提供的3种方法就已经可以很好的实现线程间的协作。

当Lock锁使用公平模式的时候,可以使用Condition的signal(),线程会按照FIFO的顺序冲await()中唤醒。当每个锁上有多个等待条件时,可以优先使用Condition,这样可以具体一个Condition控制一个条件等待。

转载地址:http://uqnqb.baihongyu.com/

你可能感兴趣的文章
Fedora Core 4硬盘安装方法(转)
查看>>
常用的系统状态查询命令(转)
查看>>
『推荐』上G的linux视频教程和电子书FTP下载,速度快内容实用!(转)
查看>>
AIX系统日常管理(转)
查看>>
Fedora Core 6的新特性(转)
查看>>
不得不说 僵尸网络导致垃圾邮件猛增(转)
查看>>
linux网络知识:TCP/IP设置内容(转)
查看>>
GNOME帮助Linux应用于商业桌面环境(转)
查看>>
linux网络知识:与网络设置有关的几个文件(转)
查看>>
Linux文件内容查询命令(转)
查看>>
libc.a 文件恢复(转)
查看>>
SCO UNIX上cpio命令详细用法(转)
查看>>
Linux系统可卸载内核模块完全指南(下)(转)
查看>>
思考-两个大表的关联.txt
查看>>
WIDTH_BUCKET和NTILE函数.txt
查看>>
sql plan baseline(二)
查看>>
第十章 sqlplus的安全性
查看>>
第十三章 sqlplus命令(一)
查看>>
第三章(backup and recovery 笔记)
查看>>
第一章(backup and recovery 笔记)
查看>>