较劲大厂面试题一---2021年BAT考核趋势JUC-AQS

2023-12-11 00:40

本文主要是介绍较劲大厂面试题一---2021年BAT考核趋势JUC-AQS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

温习读书---------------------------------------------------
Alibaba开发手册,华山版,泰山版
Java并发编程的艺术
JVM从入门到精通
深入理解JAVA虚拟机
不依赖看帖子、博客和百度和面试题

0、大厂面试复盘

京东一面:AQS源码
阿里一面:syn lock redis新的数据结构 mysql 调优
快手一面:java mysql spring循环依赖重点,三级缓存,有没有准备?
58同城: java基础,redis时效性,redis淘汰策略,惰性删除?LRU RDB?热点数据失效怎么处理?击穿 穿透 雪崩?
阿里三面:分布式锁?jmq?threadlocal?jvm?一致性哈希?volatile关键字?cas锁?syn?线程安全?

一、Java

1.1 58同城java字符串常量池《深入理解JAVA虚拟机》

在这里插入图片描述
运行结果:

58tongcheng  
58tongcheng  
true  
java  
java  
false  

面试解析:
系统初始化JDK自带的java,不是同一个java。
是加载sun.misc.Version这个类的时候进入常量池中的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 字节跳动两数求

1.给定一个数m,求大于该数的最小2的n次密,返回n
2.给定一个数组nums和一个目标值target,请你在数组中找出和为目标值的哪两个整数,并返回数组下标
数组暴力破解:

class Solution {public int[] twoSum(int[] nums, int target) {int[] result = new int[2];   //定义返回结果数组for (int i = 0; i < nums.length; i++) {for (int j = 0; j < nums.length; j++) {if (nums[j] == target - nums[i]) { //用target-nums[i]作为查询条件来判断结果if (i != j) {result[0] = j;result[1] = i;break;}}}}return result;  //如果没有返回的是空数组}
}

HashMap数据结构解法:

    Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums.length; i++) {int complement = target - nums[i];if (map.containsKey(complement)) {//满足条件直接返回结果,不继续遍历存数据return new int[] { map.get(complement), i };}map.put(nums[i], i);}throw new IllegalArgumentException("No two sum solution");
}

二、JUC

2.1 可重入锁【递归锁】

在同一个线程在外层方法获取的锁的时候,在即进入该线程的内层方法会自动获取锁,不会阻塞。
ReentrantLock synchronzied 都是可重入锁【同步锁】。
Synchronzied: 隐式锁 JVM控制 【自动挡】
ReentrantLock: 显示锁Lock ,手动来写 【手动挡】
在这里插入图片描述
也是说,同一个线程可以多次获得同一把锁。
ReentrantLock 也是一样的。

2.2 唤醒线程的3种方法

1.Object中的wait() notify()
在这里插入图片描述
notify()放于wait 之前无法执行,无法唤醒,程序一直等待下去。
必须成对,先wait再notify
2.JUC包中的Condition的 await() signal()
在这里插入图片描述
限制条件和上面如法炮制。

3.LockSupport类park() unpark() 可以阻塞当前线程,以及指定被阻塞的线程
在这里插入图片描述
单纯的唤醒和阻塞线程,不需要再锁里面

2.3 LockSupport【wait/notify的改良版park/unpark】

用于创建锁和其他基本线程阻塞原语。
每一个线程都有一个许可证,permit 不是1就是0,可以看成信号量Semaphore,与其不同的是累加的上限为1.
先等待后唤醒 先唤醒后等待 都是可以的。park()形同虚设。

三、AQS【2021年重点】

在这里插入图片描述

抽象的队列同步器 ,构建锁,其他同步器组件及整个JUC体系的基石框架。
FIFO队列来完成排对工作,并通过一个int类型表示锁的持有状态。
ReentrantLock
CountDownLantch
ReentrantReadWriteLock
Semaphore
与区别于CAS比较并交换,自旋锁。
在这里插入图片描述

3.1 锁与同步器的关系?

锁:面向使用者,定义了程序员与锁交互的应统API,隐藏了实现的细节。
同步器:面向所的实现者,java并发大神DougLee,提出了一种规范并简化了锁的实现,屏蔽了同步状态的管理,阻塞线程排对和通知,唤醒机制等。
在这里插入图片描述
AQS = State变量+CLH变种的双端队列
头尾前后指针全部都有

3.2 ReentrantLock读AQS

在这里插入图片描述
非公平锁为例,银行办理业务的案例,模拟AQS如何进行现成的管理和通知唤醒机制:

在这里插入图片描述

public class Demo01 {public static void main(String[] args) {ReentrantLock lock = new ReentrantLock();/*** 3 个线程模拟银行网点,受理顾客*/// 第一个顾客办理业务,没有人等待,A直接办理20分钟new Thread(()->{lock.lock();try{System.out.println("-----A线程进入-----");// 暂停20分钟TimeUnit.MINUTES.sleep(20);} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}},"A").start();// 第二个顾客办理业务,受理的窗口只有一个,B只能等待new Thread(()->{lock.lock();try{System.out.println("-----B线程进入-----");} finally {lock.unlock();}},"B").start();// 第三个顾客办理业务,受理的窗口只有一个,C只能等待new Thread(()->{lock.lock();try{System.out.println("-----C线程进入-----");} finally {lock.unlock();}},"C").start();}
}

1.A线程首先上锁,需要执行的:
在这里插入图片描述
2.BC线程抢不到,修改不了Status的状态,抢占失败,准备进行排队,执行acquire()方法,模板方法设计模式,抛出异常,
在这里插入图片描述
在这里插入图片描述
3.B尝试抢占锁,失败,继续尝试addWaiter()这个方法,准备入队候客区进行补位,
在这里插入图片描述
4.新建一个新的节点,并不是当前的节点B,而是一个null,作用就是哨兵节点,进行占位。
在这里插入图片描述
此时,就是成了如下的情况:
在这里插入图片描述
在这里插入图片描述
5.C线程开始准备加入队列,重复B线程的流程,入队执行addWaiter()方法,抢不到,C与B不同的是,有一个哨兵节点和B节点,
在这里插入图片描述
在这里插入图片描述
6.B开始进行阻塞,此时才真正的被阻塞,完全入队。
在这里插入图片描述
在这里插入图片描述
7.A线程办完业务,开始走人,执行unLock()方法
在这里插入图片描述
h为头指针,-1不为0,开始进行出队操作。unpark()。
在这里插入图片描述
在这里插入图片描述
开始进行状态变换,1-1=0,设置当前线程占有为null。释放锁,设置状态Status=0。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结
1.lock方法
2.AQS====调用tryAcquire()---->调用addWaiter()---->调用acquireQueued()方法
在这里插入图片描述
在这里插入图片描述

四、Spring

五、Redis

六、JVM

这篇关于较劲大厂面试题一---2021年BAT考核趋势JUC-AQS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/478868

相关文章

bat脚本启动git bash窗口,并执行命令方式

《bat脚本启动gitbash窗口,并执行命令方式》本文介绍了如何在Windows服务器上使用cmd启动jar包时出现乱码的问题,并提供了解决方法——使用GitBash窗口启动并设置编码,通过编写s... 目录一、简介二、使用说明2.1 start.BAT脚本2.2 参数说明2.3 效果总结一、简介某些情

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

一些其他面试题

阿里二面:那你来说说定时任务?单机、分布式、调度框架下的定时任务实现是怎么完成的?懵了。。_哔哩哔哩_bilibili 1.定时算法 累加,第二层每一个格子是第一层的总时间400 ms= 20 * 20ms 2.MQ消息丢失 阿里二面:高并发场景下引进消息队列有什么问题?如何保证消息只被消费一次?真是捏了一把汗。。_哔哩哔哩_bilibili 发送消息失败

zookeeper相关面试题

zk的数据同步原理?zk的集群会出现脑裂的问题吗?zk的watch机制实现原理?zk是如何保证一致性的?zk的快速选举leader原理?zk的典型应用场景zk中一个客户端修改了数据之后,其他客户端能够马上获取到最新的数据吗?zk对事物的支持? 1. zk的数据同步原理? zk的数据同步过程中,通过以下三个参数来选择对应的数据同步方式 peerLastZxid:Learner服务器(Follo

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,

未来工作趋势:零工小程序在共享经济中的作用

经济在不断发展的同时,科技也在飞速发展。零工经济作为一种新兴的工作模式,正在全球范围内迅速崛起。特别是在中国,随着数字经济的蓬勃发展和共享经济模式的深入推广,零工小程序在促进就业、提升资源利用效率方面显示出了巨大的潜力和价值。 一、零工经济的定义及现状 零工经济是指通过临时性、自由职业或项目制的工作形式,利用互联网平台快速匹配供需双方的新型经济模式。这种模式打破了传统全职工作的界限,为劳动

【Kubernetes】常见面试题汇总(三)

目录 9.简述 Kubernetes 的缺点或当前的不足之处? 10.简述 Kubernetes 相关基础概念? 9.简述 Kubernetes 的缺点或当前的不足之处? Kubernetes 当前存在的缺点(不足)如下: ① 安装过程和配置相对困难复杂; ② 管理服务相对繁琐; ③ 运行和编译需要很多时间; ④ 它比其他替代品更昂贵; ⑤ 对于简单的应用程序来说,可能不

【附答案】C/C++ 最常见50道面试题

文章目录 面试题 1:深入探讨变量的声明与定义的区别面试题 2:编写比较“零值”的`if`语句面试题 3:深入理解`sizeof`与`strlen`的差异面试题 4:解析C与C++中`static`关键字的不同用途面试题 5:比较C语言的`malloc`与C++的`new`面试题 6:实现一个“标准”的`MIN`宏面试题 7:指针是否可以是`volatile`面试题 8:探讨`a`和`&a`

Laravel 面试题

PHP模块 PHP7 和 PHP5 的区别,具体多了哪些新特性? 性能提升了两倍 结合比较运算符 (<=>) 标量类型声明 返回类型声明 try…catch 增加多条件判断,更多 Error 错误可以进行异常处理 匿名类,现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义 …… 了解更多查看文章底部链接 PHP7 新特性 为什么 PHP

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro