最新多线程与高并发编程(六)【容器】,2024一位Java中级程序员的跳槽面经

最后我们该如何学习?

1、看视频进行系统学习

这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频资料躺在网盘里,有需要的我也可以分享给你:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

2、读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

Spring源码深度解析:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Mybatis 3源码深度解析:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Redis学习笔记:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Spring Boot核心技术-笔记:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

3、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。

人生短暂,别稀里糊涂的活一辈子,不要将就。

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

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

.poll() 取值

在这里插入图片描述

使用CAS实现的原子性,并不是利用sync。

 3)sync与cas

在特定环境下效率是不一定谁高。

单线程用hashMap,LinkedList,ArrayList

高并发下执行时间短用ConcurrentHashMap,ConcurrentQueue

并发少下执行时间长用过sync

但不是绝对的,任何时候都应该以实际压测为主。

二、多线程容器

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

复习知识:

Map总的包括两个HashMap、TreeMap

HashMap是没有排序的,TreeMap内部用的是红黑树【是具有排序的,读效率高】

1. ConcurrentHashMap()


2. ConcurrentSkipListMap()


[ConcurrentHashMap()是CAS操作的,但是为什么没有ConcurrentTreeMap,因为在树上CAS实现非常麻烦,所以有了这个跳表

排序的。

跳表插入、读取原理(之前写的《Redis入门基础》最后也有讲):

在这里插入图片描述

通过重点元素来缩小范围。

3. CopyOnWriteArrayList() 写时复制,写入东西时复制一份,源码中add写方法加了sync,get读时不用加锁


原理:写的时候原元素t1复制一份t2,然后再在t2的末尾开辟一个新空间放入要插入的元素,然后写的指向和读的指向改为指向t2,因为Array长度是不变的所以需要复制,因为新老部分除了新增的完全一样所以读不用加锁。

使用环境:读特别多,写少的环境。读的时候共享锁,写的时候排它锁。

从此往下为Queue队列:

Queue常用接口:

在这里插入图片描述

.offer()[@return boolean] 类似add(),但是list.add()取不出来会抛异常【offer还可以添加一些参数来在规定时间之后尝试加入】

.size() 类似size()

.poll() 拿出来数据,这个数据在队列中删除

.peek() 拿出来数据,队列中保留

4. BlockingQueue 阻塞队列


1)ConcurrentLinkedQueue 非阻塞的

在这里插入图片描述

2)LinkedBlockingQueue 阻塞的

在这里插入图片描述

链表实现的,没有长度限制,可以一直加到内存满了(或者integer的MAX)。

在通用的接口上又加了两个方法:

.put() 往里装,如果满了线程会阻塞住

.take() 往外拿,如果空了线程会阻塞住

所以天生就实现了生产者消费者模型。

面试题:Queue和List区别到底在哪

答:Queue添加了对线程友好的API,offer peek poll,在BlockingQueue进一步新增了put、take方法,可以阻塞,天生实现了生产者消费者模型。

5. DelayQueue 时间的


按照等待时间来排序的。

在这里插入图片描述

需要实现Delayed

在这里插入图片描述

重写compareTo(Delayed),确定如何根据时间比较的

重写getDelay(TimeUnit) 拿到delay时间

等待时间越短的越先执行(按急迫程度执行)

.take() 从队列中拿出来一个

在这里插入图片描述

上图执行顺序t5 t1 t3 t2 t4

用途:按时间进行任务调度

6. PriorityQueue 优先级的


插入的元素会自动排序,从小到大,从a-z,内部实现是一个二叉树,堆排序中的最小堆或者说是小顶堆、小根堆

在这里插入图片描述

7. SynchronusQueue 阻塞的 容量为0 同步 线程池常用,用处最大


容量为0,装不了东西,不是为了装东西的,是为了给另一个线程下达任务的。

在这里插入图片描述

用途:两个线程之间互相交换数据,很类似前文说到的Exchanger,不过exchanger需要两个线程都阻塞等待完成交换,而synchronusQueue则不需要,线程池中线程之间的联系都用他。表面看没用。

8. TransferQueue 阻塞的


在这里插入图片描述

新增了.transfer(object) 放入队列

与put不同为put是有一个线程装完数据就走了,而transfer则是装完阻塞等有人取走才离开干自己的事(可以比喻为装货之后等着拿钱才走)

用途:提交一个订单进来,然后等着有人处理这个订单,才离开返回给客户一个反馈。(当然这过于底层了,一般都用MQ,如果真是自己写的java底层就可以用这个transferQueue)

面试题:


前几篇中的一道面试题:

问:两个线程,一个输出1-26,一个输出A-Z,要求交替输出,结果如1A2B3C…

答(思路,有很多种,这里提出比较重要的几点):

第一种用LockSupport,交替锁定解锁

第二种用sync、wait、notify,来控制(原题实际上想考的点是这个,重点),思路也是一样的,sync锁定各个线程,一个先wait,然后另一个输出后notify那个等待的,下图截取一部分。

最后

Java架构进阶面试及知识点文档笔记

这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理

image

Java分布式高级面试问题解析文档

其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!

image

互联网Java程序员面试必备问题解析及文档学习笔记

image

Java架构进阶视频解析合集

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

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

[外链图片转存中…(img-yRbD8l1f-1715667370210)]

Java架构进阶视频解析合集

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

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

  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值