Java多线程中多线程中wait、、notify、、notifyAll使用详解使用详解
主要介绍了Java多线程中wait、notify、notifyAll使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个
参考。一起跟随小编过来看看吧
基础知识基础知识
首先我们需要知道,这几个都是Object对象的方法。换言之,Java中所有的对象都有这些方法。
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final void wait() throws InterruptedException {
wait(0);
}
其中notify()、notifyAll()、wait(long timeout)是本地方法
其次我们需要知道这几个方法主要是用来个线程之间通信的。那可能就有人会问,既然是用来线程之间通信的,那为什么这几
个方法不是在线程类Thread上呢?对于这个问题,我们先来看下这几个方法的具体使用方式再来回答这个问题。
用法用法
Java中规定,在调用者三个方法时,当前线程必须获得对象锁。因此就得配合synchronized关键字来使用
//使用模式,不代表可运行代码
synchronized(object) {
while(contidion) {
object.wait();
}
//object.notify();
//object.notifyAll();
}
或者
public synchronized void methodName() {
while(contidion) {
object.wait();
}
//object.notify();
//object.notifyAll();
}
在synchronized拿到对象锁之后,synchronized代码块或者方法中,必定是会持有对象锁的,因此就可以使用wait()或者
notify()。
通过上述使用方法,我们也能很好理解为什么这几个方法是在Object上而不是在Thread上。因为每个对象都可以作为
synchronized锁的对象,因此wait、notify等必须和对象关联才能配合synchronized使用。
作用作用
方法方法 作用作用
wait 线程自动释放占有的对象锁,并等待notify。
notify 随机唤醒一个正在wait当前对象的线程,并让被唤醒的线程拿到对象锁
notifyAll
唤醒所有正在wait当前对象的线程,但是被唤醒的线程会再次去竞争对象锁。因为一次只有一个线程能拿到锁,所有
其他没有拿到锁的线程会被阻塞。推荐使用。
1、wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。
2、wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关键字使用,即,一般在synchronized 同步代码块
里使用 wait()、notify/notifyAll() 方法。
3、 由于 wait()、notify/notifyAll() 在synchronized 代码块执行,说明当前线程一定是获取了锁的。
当线程执行wait()方法时候,会释放当前的锁,然后让出CPU,进入等待状态。
只有当 notify/notifyAll() 被执行时候,才会唤醒一个或多个正处于等待状态的线程,然后继续往下执行,直到执行完
synchronized 代码块的代码或是中途遇到wait() ,再次释放锁。
也就是说,notify/notifyAll() 的执行只是唤醒沉睡的线程,而不会立即释放锁,锁的释放要看代码块的具体执行情况。所以在
编程中,尽量在使用了notify/notifyAll() 后立即退出临界区,以唤醒其他线程
- 1
- 2
前往页