LinkedBlockingQueue中put源码分析
查看源码得知:
LinkedBlockingQueue采用是锁分离的技术
1 2 3 4 5 6 7 8 9 10 11 | //取出锁 private final ReentrantLock takeLock = new ReentrantLock(); //取出锁条件 private final Condition notEmpty = takeLock.newCondition(); //插入锁 private final ReentrantLock putLock = new ReentrantLock(); //插入锁条件 private final Condition notFull = putLock.newCondition(); |
查看put方法源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | public void put(E e) throws InterruptedException { //判断元素为空 if (e == null ) throw new NullPointerException(); //设置元素值 int c = - 1 ; //创建节点 Node<E> node = new Node<E>(e); //获取插入锁 final ReentrantLock putLock = this .putLock; //设置数量 final AtomicInteger count = this .count; //尝试加锁 putLock.lockInterruptibly(); try { //判断如果这个数量等于容器数量说明容器满了 while (count.get() == capacity) { //等待 notFull.await(); } //插入 enqueue(node); //长度+1 //这里获取的c应该是原本的数据,getAndIncrement相当于i++ c = count.getAndIncrement(); //判断其+1后是否小于容器体积 if (c + 1 < capacity) //小于则通知其他插入线程进行插入 notFull.signal(); } finally { //解锁 putLock.unlock(); } //如果c==0表示本来没有元素,现在已经有元素了 //所以必须将其queue中的等待释放 if (c == 0 ) signalNotEmpty(); } |
其中这句源码理解挺久的:为何要加入这句话呢?
1 2 | if (c == 0 ) signalNotEmpty(); |
由于c为获取的是添加元素前的数据,判断为0说明之前该队列为空,导致take方法中的线程处于等待的状态,通过该方法可以使得其take方法中的等待线程释放,让其可以获取资源,如下c为获取的为原本queue长度
1 2 | //这里获取的c应该是原本的数据,getAndIncrement相当于i++ c = count.getAndIncrement(); |
1 | signalNotEmpty方法 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | private void signalNotEmpty() { //获取取出锁 final ReentrantLock takeLock = this .takeLock; //由于后面需要进行通知操作,所以得先获取锁 takeLock.lock(); try { //通知现在queue里面有元素了,大家可以来获取元素了 notEmpty.signal(); } finally { //解锁 takeLock.unlock(); } } |
__EOF__

本文作者:lonecloud
本文链接:https://www.cnblogs.com/lonecloud/p/8971106.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/lonecloud/p/8971106.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具