2024java常见面试题笔记

文章目录

      • 1、jdk1.8的新特性
      • 2.concurrentHashMap和HashMap区别
      • 3.线程池创建的方式
      • 4.线程池的拒绝策略有哪些
      • 5.乐观锁和悲观锁
      • 6.synchronized锁的升级
      • 7.synchronized 和 Lock 有什么区别?
      • 8.synchronized 和 ReentrantLock 区别是什么?
      • 9.CycliBarriar和CountDownLatch
      • 10.MyISAM和InnoDB的区别
      • 11.索引设计的原则?
      • 12.事务的四大特性
      • 13.事务的隔离级别
      • 14.什么是脏读?不可重复读?幻读?
      • 16.MyBatis的一级缓存和二级缓存
      • 17.niginx的负载均衡策略
      • 18.rabbitmq的使用场景,好处?
      • 19.rabbitmq的工作模式
      • 20.rabbitmq消息基于什么传输?
      • 21.rabbitmq消息积压应该怎么办?
      • 22.rabbitmq消息如何保证不丢失
      • 23.rabbitmq如何保证消息顺序一致性
      • 24.rabbitmq如何避免幂等性(消费者重复消费)
      • 25.你写代码有没有什么心得?
      • 26.Redis 与 普通缓存 相比有哪些优势?
      • 27.Redis为什么快
      • 28.Redis持久化数据
      • 29.redis过期键的删除策略
      • 30.redis内存淘汰策略
      • 31.redis事务
      • 32.Redis 主从复制
      • 33.redis的缓存
      • 34.如何保证redis的缓存一致性

1、jdk1.8的新特性

lambda表达式、Date Time API、Stream流等

2.concurrentHashMap和HashMap区别

(1)底层数据结构
JDK1.7,ConcurrentHashMap 底层采用分段的数组+链表实现,
JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表+红黑树
(2)线程安全方面
HashMap是线程不安全的
JDK1.7,ConcurrentHashMap采用分段锁,对整个桶数组进行分割为segment,每一把锁,锁容器中的一部分数据,多线程访问容器中不同数据段,不会存在锁竞争,如果是同段数据则会竞争。
JDK1.8之后放弃这种设计,采用Node数组+链表+红黑树来实现,并发控制使用synchronized和CAS,synchronized只锁当前链表或者红黑树的头结点,只要hash不冲突,就不会有锁竞争。

3.线程池创建的方式

(1)Executors工具类
创建单线程的、固定长度型的、缓存型的、可定时执行的
(2)使用ThreadPoolExecutor构造函数创建线程池

4.线程池的拒绝策略有哪些

总共有四种,
(1)抛出异常
(2)是直接丢弃
(3)丢弃掉存活时间最长的任务
(4)谁提交谁执行

5.乐观锁和悲观锁

悲观锁是假定每次获取数据时都会认为会被修改,每次操作之前都会上锁
乐观锁是每次获取数据都认为不会被修改,都不会上锁
乐观锁的实现方式:
(1)版本号机制:数据表中加版本号version,表示数据被修改次数,每次修改加1,每次更新时都会读取version值,提交时候再进行判断version值是否有变化,相等时才成功
(2)CAS算法:compare and swap,多线程下更新,只有一个线程能更新成功,会取三个值,内存位置,预期原值和新值,只有当内存地址里面的值和预期原值一样才会更新成功

6.synchronized锁的升级

无锁—》偏向锁—》轻量级锁-》重量级锁
monitor 对象头中的线程 id 设置为当前线程 id

7.synchronized 和 Lock 有什么区别?

(1)首先synchronized是Java关键字,Lock是 Java 接口;
(2)synchronized 可以给方法、代码块加锁;而 lock 只能给代码块加锁。
(3)synchronized 不需要手动获取锁和释放锁,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁和释放锁,如果没有使用 unLock()去释放锁可能造成死锁。
(4)lock可以判断自己有没有成功获取锁

8.synchronized 和 ReentrantLock 区别是什么?

(1)本质区别:synchronized 是关键字,ReetrantLock是类
(2)加锁和释放锁,ReentrantLock 必须手动获取与释放锁,而 synchronized 不需要手动开启和释放锁;
(3)作用域:ReentrantLock 只能给代码块加锁,而 synchronized 可以给方法、代码块加锁。
(4)底层实现:ReentrantLock 底层调用的是 Unsafe 的 park 方法加锁,synchronized 操作的是对象头

9.CycliBarriar和CountDownLatch

CountDownLatch一般任务分为N个子线程去执行,state也初始化为N,N个子线程是并行执行的,每个子线程执行完后countDown()一次,state减1。等到state=0,会unpark()主调用线程,然后主调用线程就会从await()函数返回,继续后余动作。
CycliBarriar是可复用的,一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行

10.MyISAM和InnoDB的区别

(1)事务方面,MyISAM不支持事务,InnoDB支持事务
(2)外键,MyISAM不支持外键和行锁,InnoDB支持外键和行锁
(3)索引方面,MyISAM采用非聚簇所用,InnoDB采用聚簇索引

11.索引设计的原则?

(1)经常查询的条件字段,where子句的列或者连接子句中的指定列
(2)经常需要排序、分组操作的字段
(3)更新频繁字段一般不适合创建索引
(4)最左前缀原则

12.事务的四大特性

ACID
(1)原子性,每个事务不可分割,要么全部成功,要么全部失败
(2)一致性,事务执行前和执行后必须处于一致性状态
(3)隔离性,并发访问数据库,事务之间是隔离的
(4)持久性,事务一旦被提交,就是永久性的改变

13.事务的隔离级别

(1)读未提交
脏读、不可重复读、幻读
(2)读已提交
不可重复读、幻读
(3)可重复读
幻读
(4)可串行化

14.什么是脏读?不可重复读?幻读?

(1)脏读
事务1读取到事务2未提交的数据,然后事务2回滚了
(2)不可重复读
事务1读取两次结果不一样,中间做了更新操作
(3)幻读
两次完全相同的查询结果不一样,中间可能做了新增和删除

16.MyBatis的一级缓存和二级缓存

(1)一级缓存
MyBatis默认开启,不能关闭,由MyBatis自己维护,其存储作用域为 SqlSession
(1)二级缓存
二级缓存的存储作用域是SqlSessionFactory ,默认关闭,所有的session可以共用,使用二级缓存的时候需要对象实现Serializable序列化接口

17.niginx的负载均衡策略

(1)轮询策略,按时间片轮询
(2)指定权重,权重和访问量成正比
(3)ip hash或url hash
(4)最少连接转发,请求转发到最少连接的那台服务器

18.rabbitmq的使用场景,好处?

(1)异步处理,提高了系统吞吐量
(2)应用业务解耦,不需要关心业务场景,只用做自己的事情
(3)流量削峰,通过增大消息队列长度,可以缓解短时间内高并发请求问题
(3)顺序消费,发送的消息按照发送顺序进行消费

19.rabbitmq的工作模式

(1)simple模式
简单模式,生产消息,放入队列,消费后删除
(2)work工作模式
消息生产到队列,消费者们同时监听同一个队列,消费消息
(3)发布订阅模式
消息生产到交换机,无条件的广播给订阅该交换机的队列进行消费
(4)路由模式
消息生产到交换机,根据Routing Key有条件的将消息筛选后发送给队列进行消费
(5)主题模式
通过用*和#的通配符来匹配队列,发布消息

20.rabbitmq消息基于什么传输?

RabbitMQ使用信道的方式来传输数据。信道是建立在真实的TCP连接内的虚拟连接,且每条TCP连接上的信道数量没有限制。

21.rabbitmq消息积压应该怎么办?

(1)调整消费者的消费能力
(2)增加队列长度上限
(3)采用限流控制
(4)使用惰性队列,接收到消息先存入到磁盘,消费的时候从磁盘加载到内存

22.rabbitmq消息如何保证不丢失

(1)采用消息确认机制,每消费一条消息会回复ack确认消息
(2)把消息持久化到磁盘
(3)增加备用队列

23.rabbitmq如何保证消息顺序一致性

(1)同类型的消费者绑定一个队列
(2)消费者进行排队消费

24.rabbitmq如何避免幂等性(消费者重复消费)

(1)消息增加唯一标识id,消费后持久化到磁盘,再次消费时进行查询,确认是否消费过
(2)设置补偿机制,确保在发生重复消费问题时,不会造成影响

25.你写代码有没有什么心得?

(1)注意方法的时间复杂度,尽量让时间复杂度降下来
(2)注意IO操作,包括数据库通信,网络通信。尽量减少IO时长
(3)打印日志,打印关键日志信息,日志信息要详细,不要冗余

26.Redis 与 普通缓存 相比有哪些优势?

(1)速度快,redis读数据每秒11万次,写数据每秒8万次
(2)可以持久化数据,支持AOF和RDB两种持久化方式
(3)存储数据结构丰富,支持string、list、hash、set、zset
(4)支持主从复制
(5)支持事务

27.Redis为什么快

(1)它是单线程的,避免了多线程下的线程切换,也没有锁的竞争
(2)采用I/O多路复用模型。非阻塞IO
(3)基于内存存储

28.Redis持久化数据

AOF:
写入机制:现将写命令进行校验,如果没问题就将该命令追加到.aof的日志文件中,也就是先放到 磁盘里,然后服务器再执行命令。如果redis宕机了,就对所有写操作进行命令重演。
写入缓存:在命令写入磁盘中,并不是直接将命令写入到磁盘,而是先放入到buffer中,等缓冲区填满的时候,异步的将缓冲区中内容写入到磁盘,这就会导致出现日志丢失
异步写入磁盘提供了三种策略:
(1)每写一条命令到都会调用fsync函数,将缓冲区命令写入到磁盘
(2)每秒调用一次fsync函数,写入磁盘
(3)服务器不主动调用,操作系统自己决定
重写机制:redis长期运行的时候,aof文件会越来越长,如果宕机后重演会非常耗时,
(1)服务器定时执行重写命令
(2)主进程fork出子进程执行重写操作,保证主进程不会被阻塞
(3)子进程遍历数据写入到新的aof文件,期间客户端的写请求写入到aof缓冲区和重写缓冲区。
(4)子进程写完aof文件后给主线程发信号,主线程把aof重写缓冲区数据写到新aof文件中
(5)新的aof文件覆盖旧的文件完成重写

RDB:全量备份,二进制文件
save命令:阻塞主线程,等待备份任务执行完
bgsave 命令:fork出子进程来执行持久化,只有在fork子进程的时候才会短暂阻塞

29.redis过期键的删除策略

三种
(1)定时过期,每个key创建定时器,到期清理
(2)惰性过期,当访问一个key时判断他是否过期,过期再清除
(3)定期过期,每隔一段时间进行检查,删除过期的key

30.redis内存淘汰策略

在Redis服务器用于缓存的内存不足时,如何处理新写入的数据
(1)全局所有数据的键选择性移除
移除最近最少使用的LRU、随机移除几个random、写操作报错
(2)设置过期时间的键选择性移除
移除最近使用少的LRU、随机移除几个random、最早过期的key先移除ttl

31.redis事务

redis事务不保证原子性,且没有回滚,中间某条事务执行失败了,前面已经执行的不回滚,后面继续执行

32.Redis 主从复制

(1)从节点执行slaveof命令
(2)从节点保存主节点信息
(3)从节点定时任务发现主节点信息,开启socket连接
(4)连接成功后,发送ping命令,主节点响应pong
(5)进行权限验证
(6)同步主节点中所有数据
(7)同步完成后,主节点持续发送写命令

33.redis的缓存

缓存雪崩:缓存同一时间大面积失效,导致所有请求都落到数据库上,造成数据库崩掉
解决方法:
(1)缓存数据过期时间设置随机
(2)热点数据永不过期
(3)定时检查更新数据
(4)使用锁控制并发读取线程数量

缓存穿透:缓存和数据库都没有数据,导致请求落在数据库上,导致数据库崩掉
解决办法:
(1)可以设置key-null的键值对
(2)采用布隆过滤器,将不存在的key拦截掉

缓存击穿:缓存中没有但是数据库中有数据,导致请求落在数据库上,导致数据库崩掉
解决办法:
(1)热点数据用不过期
(2)加互斥锁

34.如何保证redis的缓存一致性

(1)先写入数据库再更新缓存
(2)读操作双重检查,先读redis缓存,若缓存中没有数据或过期,则再去读数据库
(3)定时同步mysql数据到redis中
(4)采用消息队列,先发到消息队列中,再由消息队列同步mysql和redis中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/553724.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记(4月17日)vector底层原理

1.vector<vector>底层原理 vector是表示可变大小数组的序列容器&#xff0c;相当于一个动态的数组&#xff0c;比数组优越的在于它具有可动态改变的大小&#xff0c;同时&#xff0c;它写成了类模板&#xff0c;说明可以适用于其他类型&#xff0c;包括vector本身&#…

AI赋能自动化测试:智能接口自动化测试数据生成平台设计思路

目录 1.背景 2.名词解释 3.设计目标 4.设计思路及折衷 4.1阶段性任务 4.2方案选型 4.2.1 设计方案选型 4.2.1.1 原始数据获取模块 4.2.1.2 数据构造模块 4.2.1.3 预执行模块 4.2.1.4 覆盖率反馈调整模块 4.2.1.5 预测模型 4.2.2 技术选型 5.系统设计 5.1 项目架…

LeetCode669:修剪二叉搜索树

题目描述 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&#xff0c;原有的父代子代关系都应…

vivo怎么录屏?玩转手机新体验!(2024最新)

“最近新入手了一款vivo手机&#xff0c;感觉用起来真的很顺手&#xff0c;各种功能都很强大。昨天和朋友一起打游戏&#xff0c;突然想到要记录下精彩瞬间&#xff0c;但是找遍了手机&#xff0c;都没有找到录屏功能。我想请教一下各位vivo手机用户&#xff0c;你们通常在哪里…

解决动态规划问题

文章目录 动态规划的定义动态规划的核心思想青蛙跳阶问题解法一&#xff1a;暴力递归解法二&#xff1a;带备忘录的递归解法&#xff08;自顶向下&#xff09;解法三&#xff1a;动态规划&#xff08;自底向上&#xff09; 动态规划的解题套路什么样的问题考虑使用动态规划&…

转录组上游分析,Count计算

本期教程原文链接&#xff1a;转录组定量&#xff0c;最简单的操作&#xff0c;你会吗&#xff1f; 本期教程 第六章 转录本定量分析 定量软件有RSEM,eXpress,salmoe,kallisto&#xff0c;featureCounts。在网络中吗&#xff0c;都有比较详细的教程&#xff0c;大家可以自己去…

最新UI发卡盗U,支持多语言,更新UI界面,支持多个主流钱包,附带系统搭建教程

环境&#xff1a;Linux系统 进入宝塔安装环境&#xff1a;Nginx 1.22.1 MySQL 8.0 php7.4 phpMyAdmin 5.2 按照说明去安装环境&#xff0c;如果没有找到MySQL8.0版本去"软件商店"搜索Mysql切换至8.0 1.上传开源源码 2.上传数据库文件 3.上传猴导入数据库文件 4.修…

SpringBoot+FreeMaker

目录 1.FreeMarker说明2.SpringBootFreeMarker快速搭建Pom文件application.properties文件Controller文件目录结构 3.FreeMarker数据类型3.1.布尔类型3.2.数值类型3.3.字符串类型3.4.日期类型3.5.空值类型3.6.sequence类型3.7.hash类型 4.FreeMarker指令assign自定义变量指令if…

HTML学习笔记:(一)基础方法

Html格式 里面文件使用平台为&#xff1a;w3school 1、基础功能&#xff1a; <html><head> <title>这是我的第一个html页面,会显示在浏览器的标题栏中</title> </head> <!--修改背景颜色 --> <body bgcolor"yellow"> …

QtQuick 学习笔记(二)按钮组件

1. QPushButton 功能 按压按钮&#xff0c;用于接受用户点击事件&#xff0c;可显示设定的字符串提示信息&#xff0c;但需要父组件作为容器&#xff0c;多用以执行命令或触发事件 常用函数 QPushButton&#xff1a;&#xff1a;QPushButton&#xff08;const QString &…

RHCE1

unit1.定时任务和延迟任务项目 1.在系统中设定延迟任务要求如下: 在系统中建立easylee用户&#xff0c;设定其密码为easylee 延迟任务由root用户建立 要求在5小时后备份系统中的用户信息文件到/backup中确保延迟任务是使用非交互模式建立 再使用chmod修改权限&#xff1a; 确保…

HarmonyOS真机调试页面运行卡顿/黑屏解决方法,亲测有效

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 用mate40等发行时间相对较早但系统是HarmonyOS4.0的真机调试 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 程序点击容易卡顿或黑屏 原因分析&#xff1a; CPU兼容问题导致屏幕…

Text2sql的一些技巧

最近看到了一篇关于text2sql的文章&#xff0c;以及一些论文。对使用模型做text2sql给了一些不错的建议。 参考文章&#xff1a;24年大模型潜力方向&#xff1a;大浪淘沙后的Text-to-SQL和Agent - 知乎 论文&#xff1a;https://arxiv.org/pdf/2403.09732.pdf 关于模型的建议 …

STM32H7定时器TIM1-TIM17中断、PWM实现

STM32H7定时器TIM1-TIM17中断、PWM实现 高级定时器硬件框图定时器模式时基输出PWM定时器输入捕获 TIM1-TIM17的中断配置TIM1-TIM17的PWM输出 STM32H7 支持的定时器有点多&#xff0c;要简单的区分下。STM32H7 支持 TIM1-TIM8&#xff0c;TIM12-TIM17 共14 个定时器&#xff0c;…

使用API有效率地管理Dynadot域名,锁定账户中的域名

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

Zynq7000系列中的时钟管理

PS&#xff08;处理系统&#xff09;时钟子系统生成的所有时钟都源自三个可编程PLL&#xff08;锁相环&#xff09;中的一个&#xff1a;CPU、DDR和I/O。时钟子系统的主要组件如图25-1所示。 在正常工作期间&#xff0c;PLL被启用&#xff0c;并由PS_CLK时钟引脚驱动。在启用P…

6.6Python之集合的基本语法和特性

集合&#xff08;Set&#xff09;是Python中的一种无序、不重复的数据结构。集合是由一组元素组成的&#xff0c;这些元素必须是不可变数据类型&#xff0c;但在集合中每个元素都是唯一的&#xff0c;即集合中不存在重复的元素。 集合的基本语法&#xff1a; 1、元素值必须是…

24卫生高级职称报名时间汇总⏰报名全流程

⏰卫生高级职称&#xff08;网上报名&#xff09;时间汇总 ✔️陕西&#xff1a;4月23日-5月24日 ✔️上海&#xff1a;4月23日-5月24日 ✔️重庆&#xff1a;4月23日—5月24日 ✔️黑龙江&#xff1a;4月23日-5月24日 ✔️浙江&#xff1a;4月23日-5月24日 ✔️云南&#xff1…

面试自救指南:女生如何巧答私密问题

在面试过程中&#xff0c;女性应聘者可能会遇到一些私人问题&#xff0c;这些问题可能涉及婚姻、家庭、生育等方面。面对这些问题&#xff0c;如何回答才能既保持真实又不失礼节呢&#xff1f; 当遇到关于婚姻状况的问题时&#xff0c;您可以选择回答&#xff1a;“我目前的婚姻…

【Python深度学习系列】网格搜索神经网络超参数:权重初始化方法(案例+源码)

这是我的第262篇原创文章。 一、引言 在深度学习中&#xff0c;超参数是指在训练模型时需要手动设置的参数&#xff0c;它们通常不能通过训练数据自动学习得到。超参数的选择对于模型的性能至关重要&#xff0c;因此在进行深度学习实验时&#xff0c;超参数调优通常是一个重要的…
最新文章