2024年阿里P9整理Java 高频面试题聊一聊 JUC 下的 LinkedBlockingQueue,怒肝三个月啃完这110道面试题

最后

现在其实从大厂招聘需求可见,在招聘要求上有高并发经验优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。

所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。

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

需要这份系统化的资料的朋友,可以点击这里获取

//获取但不移除此队列的头;如果此队列为空,则返回 null。

E peek();

LinkedBlockingQueue 队列的读写方法非常的多,但是常用的是 put()、take()方法,因为它们两是阻塞的,所以我们就从源码的角度来聊一聊 LinkedBlockingQueue 队列中这两个方法的实现。

先来看看 put()方法,源码如下:

public void put(E e) throws InterruptedException {

if (e == null) throw new NullPointerException();

// 预先设置 c 的值为 -1,表示失败

int c = -1;

Node node = new Node(e);

// 获取写锁

final ReentrantLock putLock = this.putLock;

// 获取当前队列的大小

final AtomicInteger count = this.count;

// 设置可中断锁

putLock.lockInterruptibly();

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

java开发必备面试题详解(技术+人事)

====================

总结

这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!

某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!

成功只会留给那些有准备的人!

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

需要这份系统化的资料的朋友,可以点击这里获取

成功只会留给那些有准备的人!

[外链图片转存中…(img-kuOXUU9S-1715271964235)]

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

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值