您的位置 首页 java

通过notify和notifyAll函数,理解并发编程中的锁池,等待池

本文为小编原创文章,首发于 Java识堂 ,一个高原创,高收藏,有干货的 微信公众号, 一起成长,一起进步,欢迎关注

介绍

锁池EntryList

等待池WaitSet

锁池

假设 线程 A已经拥有了某个对象(不是类)的锁,而其他线程B,C想要调用这个对象的某个 synchronized 方法(或者块),由于B,C线程在进入对象的synchronized方法(或者块)之前就必须先获得该对象锁的拥有权,而恰巧该对象的锁目前正被线程A所占用,此时B,C线程就会被阻塞,进入一个地方去等待锁的释放,这个地方便是该对象的锁池

等待池

假设线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁,同时线程A就进入到了该对象的等待池中,进入到等待池中的线程不会去竞争改对象的锁

notifyAll会让所有处于等待池的线程全部进入锁池去竞争获取锁的机会

notify只会随机选取一个处于等待池中的线程进入锁池去竞争获取锁的机会

例子

我们用例子演示说明

开3个等待的线程,一个通知的线程,通知的线程里面调用notify方法

看到只有一个线程结束了,其余2个线程一直阻塞。

thread2 wait
thread3 wait
thread1 wait
thread2 notify
 

将notifyTask中的notify换成notifyAll,输入如下,可以看到3个线程都正常结束

thread1 wait
thread2 wait
thread3 wait
thread3 notify
thread2 notify
thread1 notify
 

推荐阅读:

大家的理解是怎样的呢?欢迎交流探讨

文章来源:智云一二三科技

文章标题:通过notify和notifyAll函数,理解并发编程中的锁池,等待池

文章地址:https://www.zhihuclub.com/180686.shtml

关于作者: 智云科技

热门文章

网站地图