synchronized锁和wait()等待

Object#wait()方法
wait() 使当前线程处于等待状态,直到另外的线程调用 notify 或 notifyAll 将它唤醒。在等待唤醒的期间,它处在等待唤醒的池子_waitSet等待池中。当调用 wait() 方法后,会释放锁,进入等待池。当调用 notify() 或 notifyAll() 后唤醒该对象监听的其中一个或所有线程(HotSpot是FIFO队列)。

等待池
假设线程 A 调用了某个对象的 wait() 方法,则 A线程就会释放该对象的锁(因为 wait() 方法必须出现在 synchronized 中,所以在执行 wait() 方法之前 A线程就已经拥有了该对象的锁),同时线程 A进入到了该对象的等待池中。如果有其它线程调用了相同对象的 notifyAll() 方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,从新争夺锁的拥有权。如果另外的一个线程调用了相同对象的 notify() 方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池。

wait() 对应等待池,synchronized 对应锁池。

加了 synchronized 关键字的地方就会有相应的获取锁的步骤。未竞争到锁的线程会加入到锁池。

锁池
假设线程 A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用该对象的 synchronized 方法(或者 synchronized 块),其他未获得锁的线程在进入对象的 synchronized 方法之前都需要先获得该对象的锁的拥有权,但是该对象的锁目前正被 A线程拥有,所以这些线程就进入了该对象的锁池中。

等待池和锁池中的资源只要重新获得了对象的拥有权,那么就会被对应的池剔除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值