多图详解CLH锁的原理与实现,面试字节跳动两轮后被完虐

前言

这期我想写很久了,但是因为时间的原因一直拖到了现在,我以为一两天就写完了,结果从构思到整理资料,再到写出来用了差不多一周的时间吧。

你们也知道作者一直都是创作鬼才来的,所以我肯定不会一本正经的写,我想了好几个切入点,最后决定用一个完整的电商系统作为切入点,带着大家看看,我们需要学些啥,我甚至还收集配套视频和资料,暖男石锤啊,这期是呕心沥血之作,不要白嫖了。

阿里巴巴一面

  • 自我介绍这个就不说了,开头必问的
  • 说一下StringBuilder 和 StringBuffer
  • Spring bean加载,实例化的过程
  • Spring AOP源码看过吗
  • java内存模型说一下
  • 如果给你一个map,里面有很多很多对象,那么这个map存放在哪
  • 了解GC算法吗?
  • 说一下CMS垃圾回收器
  • B+树和B树的区别?
  • haspmap底层讲一讲
  • ConcurrentHashMap的底层实现?
  • CAS是硬件实现还是软件实现?
  • volatile是锁吗?
  • 淘宝和京东的区别,你觉得是什么?

项目相关:

  • 介绍一下你简历上写的项目?自己主要做了什么?
  • 你觉得项目里给你最大的挑战是什么?遇到了什么问题?如何解决的?从中学到了什么?
  • 项目的架构图能画一下不?
  • 觉得项目有哪些地方可以改进完善?
  • 如果我有很多字段都需要建立索引,怎么办?
  • Mysql的存储引擎,你用的是哪种?

代码面:

  • 设计一个多线程打印程序,第i个线程只打印i-1数字,比如第1个线程打印数字0,第2个线程只打印数字1,依次类推。任意给定一个数字序列,比如3382019835830,能够使用该程序打印出来。
  • 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。

阿里巴巴二面

  • 又聊了项目
  • 你说到你项目里用了UDP,你为什么不用TCP
  • 那你详细说一下TCP和UDP的区别
  • 数据库用的是什么(MySQL)
  • 那你的数据量是多少(几百万)
  • 那你这几百万条,做了什么查询优化(索引)
  • 怎么建的索引
  • 为什么用时间和id来做索引?
  • 数据库的隔离级别
  • 知道什么是主从复制吗?
  • 你说一下建立索引的规则
  • JAVA类加载机制(加载验证准备解析初始化,又说到双亲委派模型)
  • 线程池所有参数讲一讲
  • ConcurrentHashMap的底层实现
  • RPC用过吗?
  • 消息队列呢?

**总结:**前面问了一些基础性的东西,然后就一直往深了问,问的也基本是有关项目的问题,因为之前做的本身就是一个小项目,也并没有什么亮点,二面结束我就回去等通知了,结果也肯定是凉凉了。

汲取教训,突破底层技术

其实每次面试不管成功还是失败,都是一次很好的学习机会,所以一定要认真对待每次面试,从面试中总结经验,在面试中扫盲,然后回家进行查漏补缺。

首先就是在面试结束后梳理自己的知识体系,这份大纲是目前一线大厂主流的技术,也是面试的重点,大家可以对照梳理自己的知识点,用来扫盲最好不过了

梳理完知识点后结合面试所问到的内容,大致可以看出是哪些不足,然后针对这些知识点再一步一步的深度挖掘,从这位读者的面试看出,他应该可以深度学习一下数据库方面的知识,那接下来我也就跟大家主要的分享一下关系型数据库——MySQL的深度进阶。

MySQL深度进阶

MySQL基础内容(稍微带过)

  • MySQL基本介绍
  • MySQL架构组成
  • MySQL存储引擎简介
  • MySQL安全管理
  • MySQL备份与恢复

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

MySQL性能优化

  • 影响MySQLServer性能的相关因素
  • MySQL数据库锁定机制
  • MySQL数据库Query的优化
  • MySQL数据库Schema设计的性能优化
  • MySQLServer性能优化
  • 常用存储引擎优化

![](https://upload-ima

点击领取2024完整开源项目《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

ges.jianshu.io/upload_images/22932333-e60e78e36eabddf7?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

MySQL架构设计

  • MySQL可扩展设计的基本原则
  • 可扩展性设计之MySQLReplication
  • 可扩展性设计之数据切分
  • 可扩展性设计之Cache与Search的利用
  • MySQLCluster
  • 高可用设计之思路及方案
  • 高可用设计之MySQL监控

最后

对于很多Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

再分享一波我的Java面试真题+视频学习详解+技能进阶书籍

美团二面惜败,我的凉经复盘(附学习笔记+面试整理+进阶书籍)

少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。**

再分享一波我的Java面试真题+视频学习详解+技能进阶书籍

[外链图片转存中…(img-nfaAhrGR-1709807985117)]

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

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AQS(AbstractQueuedSynchronizer)是Java中实现同步器的框架,它提供了一种基于FIFO队列的阻塞和唤醒机制。AQS的阻塞队列原理是通过CLH(Craig, Landin, and Hagersten)队列来实现的。 CLH队列是一种虚拟的双向链表,它仅存在节点之间的关联关系,而不存在队列的实例。每个请求共享资源的线程都会被封装成一个CLH队列的节点(Node)。当线程请求共享资源时,它会被添加到CLH队列的尾部,并进入阻塞状态。 当共享资源被占用时,其他线程请求该资源的线程会被放入CLH队列的末尾,即排队等待。这种排队等待的方式可以保证请求资源的线程按照FIFO的顺序获得资源,避免了饥饿现象。当资源释放后,AQS会自动唤醒队列中的下一个线程,使其获得资源并继续执行。 需要注意的是,AQS的同步队列(Sync queue)是一个双向链表,包括头节点(head)和尾节点(tail),用于后续的调度。而条件队列(Condition queue)是一个单向链表,只有在使用Condition时才会存在,并且可能会有多个条件队列。 总结一下,AQS实现阻塞队列的原理是通过CLH队列来实现的,当共享资源被占用时,请求资源的线程会被添加到CLH队列中排队等待。当资源释放后,AQS会自动唤醒队列中的下一个线程,使其获得资源并继续执行。同步队列用于后续的调度,而条件队列只在使用Condition时才会存在。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值