Object类九大方法之notify和notifyAll方法

简介: Object类九大方法之notify和notifyAll方法

Object类九大方法之notify和notifyAll方法



notify()方法表示,当前的线程已经放弃对资源的占有, 通知等待的线程来获得对资源的占有权,但是只有一个线程能够从wait状态中恢复,然后继续运行wait()后面的语句;只会唤醒等待该锁的其中一个线程。

notifyAll()方法表示,当前的线程已经放弃对资源的占有, 通知所有的等待线程从wait()方法后的语句开始运行; 唤醒等待该锁的所有线程。

对象内部锁

其实,每个对象都拥有两个池,分别为锁池(EntrySet)和(WaitSet)等待池。


锁池:假如已经有线程A获取到了锁,这时候又有线程B需要获取这把锁(比如需要调用synchronized修饰的方法或者需要执行synchronized修饰的代码块),由于该锁已经被占用,所以线程B只能等待这把锁,这时候线程B将会进入这把锁的锁池。

等待池:假设线程A获取到锁之后,由于一些条件的不满足(例如生产者消费者模式中生产者获取到锁,然后判断队列为满),此时需要调用对象锁的wait方法,那么线程A将放弃这把锁,并进入这把锁的等待池。

如果有其他线程调用了锁的notify方法,则会根据一定的算法从等待池中选取一个线程,将此线程放入锁池。

如果有其他线程调用了锁的notifyAll方法,则会将等待池中所有线程全部放入锁池,并争抢锁。


锁池与等待池的区别:

等待池中的线程不能获取锁,而是需要被唤醒进入锁池,才有获取到锁的机会。


eg:

有两个生产者A和B,两个消费者C和D,以及一个长度为1的队列。


初始状态,这四个线程全部进入锁池,等待抢占锁。

C获取到锁,但是队列为空,故C进入等待池。

D获取到锁,但是队列为空,故D进入等待池。

A获取到锁,生产,队列满,调用notify,唤醒一个线程。由于此时C和D都在等待池中,所以会有一个线程从等待池进入锁池,假设此处C进入锁池。

此时,锁池有B和C两个线程,假设B获取到了锁,但是队列满,故B进入等待池,放弃锁。

此时,C获取到锁,消费,notify,由于此时等待池有两个线程B和D,假如唤醒的是B,没问题开始生产,但是若唤醒的是D,则因队列为空,继续wait。


如果此处是一个生产者一个消费者的情况,使用notify没有任何问题,且效率更高。

目录
相关文章
|
7天前
|
数据安全/隐私保护
作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户
该博客文章通过示例演示了如何使用session对象的`setAttribute`和`getAttribute`方法在不同页面间传递和显示用户的用户名和密码信息,并说明了如何设置会话的有效期。
作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户
|
7天前
|
前端开发 Java 编译器
【前端学java】java中的Object类和前端中的Object有什么区别(9)
【8月更文挑战第10天】java中的Object类和前端中的Object有什么区别
14 0
【前端学java】java中的Object类和前端中的Object有什么区别(9)
|
12天前
|
算法 Java
12 Java常用类(一)(内部类+object类+包装类)
12 Java常用类(一)(内部类+object类+包装类)
25 5
|
1月前
|
Java
Java中的Object类 ( 详解toString方法 | equals方法 )
Java中的Object类 ( 详解toString方法 | equals方法 )
|
2月前
|
存储 JSON 前端开发
JavaScript 进阶征途:解锁Function奥秘,深掘Object方法精髓
JavaScript 进阶征途:解锁Function奥秘,深掘Object方法精髓
|
2月前
|
Java
【Java】Object类简单解析
【Java】Object类简单解析
25 1
|
2月前
|
前端开发 JavaScript Java
Java基础10-深入理解Class类和Object类(二)
Java基础10-深入理解Class类和Object类(二)
30 5
|
2月前
|
Java C++
Java基础10-深入理解Class类和Object类(一)
Java基础10-深入理解Class类和Object类(一)
30 4
|
2月前
|
Java API
API:object当中的各种方法刨析(今日份:equals toString)
API:object当中的各种方法刨析(今日份:equals toString)
|
3月前
|
Java
Java Object 类
5月更文挑战第16天