阿里P9整理Java 高频面试题聊一聊 JUC 下的 LinkedBlockingQueue

try {

// 队列满了

// 当前线程阻塞,等待其他线程的唤醒(其他线程 take 成功后就会唤醒此处线程)

while (count.get() == capacity) {

// 无限期等待

notFull.await();

}

// 新增到队列尾部

enqueue(node);

// 获取当前的队列数

c = count.getAndIncrement();

// 如果队列未满,尝试唤醒一个put的等待线程

if (c + 1 < capacity)

notFull.signal();

} finally {

// 释放锁

putLock.unlock();

}

if (c == 0)

signalNotEmpty();

}

put()方法的源码并不难,非常容易就看懂,put()方法的过程大概如下:

  • 1、先加锁,保证容器的并发安全~

  • 2、队列新增数据,将数据追加到队列尾部~

  • 3、新增时,如果队列满了,当前线程是会被阻塞的,等待被唤醒~

  • 4、新增数据成功后,在适当时机,会唤起 put 的等待线程(队列不满时),或者 take 的等待线程(队列不为空时),这样保证队列一旦满足 put 或者 take 条件时,立马就能唤起阻塞线程,继续运行,保证了唤起的时机不被浪费offer 就有两两种,一种是直接返回 false,另一种是超过一定时间后返回 false~

  • 5、释放锁~

其他的新增方法,例如 offer,可以查看源码,跟put() 方法大同小异,相差不大~

再来看看 take()方法,源码如下:

public E take() throws InterruptedException {

E x;

// 默认负数

int c = -1;

// 当前链表的个数

final AtomicInteger count = this.count;

//获取读锁

final ReentrantLock takeLock = this.takeLock;

takeLock.lockInterruptibly();

try {

// 当队列为空时,阻塞,等待其他线程唤醒

while (count.get() == 0) {

notEmpty.await();

}

// 从队列的头部拿出一个元素

x = dequeue();

//减一操作,C比真实的队列数据大一

c = count.getAndDecrement();

// c 大于 0 ,表示队列有值,可以唤醒之前被阻塞的读线程

if (c > 1)

notEmpty.signal();

} finally {

// 释放锁

takeLock.unlock();

}

// 队列未满,可以唤醒 put 等待线程~

if (c == capacity)

signalNotFull();

return x;

}

take()方法跟 put() 方法类似,是一个相反的操作,我就不做过多的说明了~

以上就是 LinkedBlockingQueue 队列的简单源码解析,希望对你的面试或者工作有所帮助,感谢你的阅读~

最后,再附上我历时三个月总结的 Java 面试 + Java 后端技术学习指南,这是本人这几年及春招的总结,目前,已经拿到了大厂offer,拿去不谢!

如何拿下阿里等大厂的offer的呢,今天分享一个秘密武器,资深架构师整理的350页java开发面试真题和开发必备面试题详解(技术+人事),面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。

由于整个文档比较全面,内容比较多,篇幅的限制,文章中分享没有全部附上详细的解析,但是整理成了一份详细的PDF文档可分享给大家,文末有免费领取方式。

JAVA面试题手册

=========

一性能优化面试专栏

二微服务架构面试专栏

三并发编程高级面试专栏

阿里P9整理Java 高频面试题聊一聊 JUC 下的 LinkedBlockingQueue

四、开源框架面试题专栏

阿里P9整理Java 高频面试题聊一聊 JUC 下的 LinkedBlockingQueue

阿里P9整理Java 高频面试题聊一聊 JUC 下的 LinkedBlockingQueue

五、分布式面试专栏

阿里P9整理Java 高频面试题聊一聊 JUC 下的 LinkedBlockingQueue

阿里P9整理Java 高频面试题聊一聊 JUC 下的 LinkedBlockingQueue

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

学习视频:

大厂面试真题:

每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频**

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-CQl2ZlBw-1710436476721)]

最后

学习视频:

[外链图片转存中…(img-lssi9AxE-1710436476722)]

大厂面试真题:

[外链图片转存中…(img-Db5dMz0n-1710436476722)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 13
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值