java 等待池_java并发相关(三)—— object的wait() ,notifyAll(),notify() 方法与锁池、等待池...

一、object的wait() ,notifyAll(),notify() 三个方法

上述三个方法只能在Synchronized代码块内运行,显而易见其原理其实离不开Synchronized的实现。

wait()

该方法用来将当前线程置入休眠状态,直到接到通知或被中断为止。在调用 wait()之前,线程必须要获得该对象的对象级别锁,即只能在同步方法或同步块中调用 wait()方法。

如果调用 wait()时,没有持有适当的锁,则抛出 IllegalMonitorStateException,它是 RuntimeException 的一个子类,因此,不需要 try-catch 结构。

进入 wait()方法后,当前线程释放锁。此时线程实际进入图一中的waiting状态,进入图二中的waitset(等待池)待授权

notify()

该方法也要在同步方法或同步块中调用,即在调用前,线程也必须要获得该对象的对象级别锁,的如果调用 notify()时没有持有适当的锁,也会抛出 IllegalMonitorStateException。

该方法用来通知那些可能等待该对象的对象锁的其他线程,如果有多个线程等待,则线程规划器任意挑选出其中一个 wait()状态的线程来发出通知,并使它等待获取该对象的对象锁

notify 方法其实只会选择一个等待池的待授权集合的对象A进入等待池的已授权集合,但此时还要等待持有锁的对象释放锁,对象A所在的线程也才有可能获取该对象锁。但实际上,锁池内等候的对象也会一起竞争这把锁,竞争到了才能进入同步代码块。

notifyAll()

该方法与 notify ()方法的工作方式相同,重要的一点差异是:

notifyAll 使所有原来在该对象上 wait 的线程统统退出 wait 的状态,即全部进入等待池的已授权集合。

二、我们知道线程一共有七种状态,之间转换如下图:

e9746281a9896a38ecc01b145d635b89.png

(图一)

三、锁池与等待池

只考虑重量级所得情况,那么可以认为等待池的线程从待授权集合进入已授权集合,就是进入了锁池的集合。

e2e45da7fa8ebc8558d6b83860f090fe.png

(图二)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值