隐藏页面特效

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 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   lonecloud  阅读(681)  评论(2编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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工具
我的博客即将同步至 OSCHINA 社区,这是我的 OSCHINA ID:lonecloud,邀请大家一同入驻:https://www.oschina.net/sharing-plan/apply
点击右上角即可分享
微信分享提示