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.mzph.cn/web/1375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mini-Gemini: 探索多模态视觉语言模型的新境界

一、背景 在数字化时代,人工智能的发展正以前所未有的速度推进。特别是在多模态学习领域,结合视觉和语言的能力已成为研究的热点。最近,一篇名为“Mini-Gemini: Mining the Potential of Multi-modality Vision Language Models”的文章在arX…

05 MySQL--字段约束、事务、视图

1. CONSTRAINT 约束 创建表时,可以给表的字段添加约束,可以保证数据的完整性、有效性。比如大家上网注册用户时常见的:用户名不能为空。对不起,用户名已存在。等提示信息。 约束包括: 非空约束:not null检…

【C++类和对象】const成员函数及流插入提取

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

Java一键发送邮件:封装好的工具类详解

一、引言 在Java应用中,邮件发送功能经常用于通知、验证等场景。然而,每次发送邮件都需要编写大量的代码来配置SMTP服务器、认证信息、邮件内容等,这不仅效率低下,而且容易出错。为了解决这个问题,我们可以封装一个邮…

Elasticsearch 开放 inference API 增加了对 OpenAI chat completions 的支持

作者:Tim Grein 我们很高兴地宣布在 Elasticsearch 中推出的最新创新:在 Elastic 的 inference API 中集成了 OpenAI Chat Completions 功能。这一新特性标志着我们在整合尖端人工智能能力至 Elasticsearch 的旅程中又迈出了一步,提供了生成类…

凭证自动拆分

凭证自动拆分 一、设置拆分中间科目 OBX2配置凭证拆分的中间科目 二、销售开票凭证拆分 SE18创建BADI "FI_BILL_ISSUE_SPLIT"的实施 修改实施类:ZCL_FI_BILL_ISSUE_SPLIT中IF_EX_FI_BILL_ISSUE_SPLIT~ACTIVATE_AUTOMATIC_SPLIT方法,代码…

ruoyi-vue前端的一些自定义插件介绍

文章目录 自定义列表$tab对象打开页签关闭页签刷新页签 $modal对象提供成功、警告和错误等反馈信息(无需点击确认)提供成功、警告和错误等提示信息(类似于alert,需要点确认)提供成功、警告和错误等提示信息&#xff08…

vue 的生命周期--图解

生命周期函数中的this指向是vm 或 组件实例对象。 常用的生命周期钩子: mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】。 关于销毁Vue实例 销毁后借助Vu…

常见排序算法(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序,基数排序,桶排序)

一.排序的概念 1.排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作 2.稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排…

Basic TCP Server Client

Server #include <stdio.h> #include <string.h> #include <unistd.h> // read and write (TCP); sendto and recvfrom (UDP) #include <arpa/inet.h> // 包含#include <sys/socket.h>int main(int argc, char* argv[]) {// 1. 创建监听fdint f…

【C++】List容器(2)-内存管理-创建-插入-删除-遍历-排序-查找-底层分析-构造和析构函数-内存泄漏等

std::list 是 C STL 中的一种双向链表容器&#xff0c;它提供了一系列的迭代器来访问元素&#xff0c;包括前方迭代器、后方迭代器和const迭代器。std::list 采用双向链表实现&#xff0c;每个节点都存储了数据以及两个指向前一个节点和后一个节点的指针。 内存管理 在 C 中&…

MATLAB设置变量

您可以通过简单的方式分配变量。例如&#xff0c; 示例 x 3 %定义x并用值初始化它 MATLAB将执行上述语句并返回以下结果- x 3 它创建一个名为x的1乘1矩阵&#xff0c;并将值3存储在其元素中。再举一个实例&#xff0c; 示例 x sqrt(16) %定义x并用表达式初始化它 MATLAB将…

自动化测试Selenium(3)

目录 WebDriver相关API 打印信息 打印title 打印url 浏览器的操作 浏览器最大化 设置浏览器的宽,高 操作浏览器的前进, 后退, 刷新 控制浏览器滚动条 键盘事件 键盘单键用法 键盘组合按键用法 鼠标事件 WebDriver相关API 打印信息 打印title 即打印该网址的标题.…

在PostgreSQL中,如何创建一个触发器并在特定事件发生时执行自定义操作?

文章目录 解决方案示例代码1. 创建自定义函数2. 创建触发器 解释 在PostgreSQL中&#xff0c;触发器&#xff08;trigger&#xff09;是一种数据库对象&#xff0c;它能在特定的事件&#xff08;如INSERT、UPDATE或DELETE&#xff09;发生时自动执行一系列的操作。这些操作可以…

css-Echarts图表初始显示异常非完全显示

1.echarts图表初始加载异常 2.问题原因 初次加载时&#xff0c;由于外层使用%比 echarts dom元素没有完全加载完成&#xff0c;canvas绘画继承本身宽高&#xff0c;造成Echarts图表初始显示异常非完全显示。 3.使用echarts图表可参考以下代码&#xff08;实现一定的自适应&am…

* 玩转数据魔方Plotly Express实战8例

大家好&#xff01;今天我们要一起探索Plotly Express这个超级棒的数据可视化神器。想象一下&#xff0c;你的数据故事能以炫酷图表的形式跃然纸上&#xff0c;是不是很兴奋&#xff1f;Plotly Express就像魔法棒&#xff0c;让复杂数据瞬间变得生动起来。接下来&#xff0c;让…

mac qt android开发环境

1,安装Android Studio 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers (google.cn)

MyBatis 核心配置讲解(上)

大家好&#xff0c;我是王有志&#xff0c;一个分享硬核 Java 技术的互金摸鱼侠。 前两篇的文章中我们分别介绍了 MyBatis 和 MyBaits 的应用组成&#xff0c;到这里基础篇的内容就结束了。 从今天开始&#xff0c;我们正式进入 MyBatis 学习的第二阶段&#xff1a;MyBatis 的…

Linux网络实战(一)- DNS配置

Linux网络实战&#xff08;一&#xff09;- DNS配置 1 Linux 本机DNS配置编程要求预期输出输入 2 安装DNS服务软件编程要求测试说明输入 3 DNS服务器启动/关闭编程要求测试说明输入 4 DNS服务器配置编程要求测试说明输入 1 Linux 本机DNS配置 编程要求 在右侧命令行中配置本地…

【Qt 学习笔记】Qt常用控件 | 显示类控件LCD Number的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 显示类控件LCD Number的使用及说明 文章编号&#xff1a…