java中级面试题

news2024/9/25 9:34:12

1.假如有两个线程共同操作数据库,以乐观锁的角度考虑,怎么确保不会发生并发问题?

PS:考点是CAS,比较并替换。CAS中有三个值,内存中的值,新值,旧值。

假如内存中的值是2000,要进行--操作,A,B两个线程分别从主内存中拉去数据,当A线程进行--操作,新值变成了1999,旧值与主内存中的值一致,将新值替换掉主内存中的值,此时主内存值为1999。当B线程进行--操作,新值也是1999,比较主内存值1999与旧值2000不一致,拉去主内存值,在--,此时旧值变成了1999,新值变成了1998……

依次类推,AB线程共同操作共享资源,数据也不会出现并发问题。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbWVldGJldHRlcmhj,size_20,color_FFFFFF,t_70,g_se,x_16

2. redis缓存击穿、穿透、雪崩

击穿:数据库中有,缓存中没有的数据。

解决办法:

  • 设置热点数据永不过期
  • 加互斥锁

穿透:缓存和数据库中都没有的数据。

解决办法:

  • 将value的值赋为null
  • 在接口层增加校验
  • 布隆过滤器:快速检索一个元素是否在集合中,不存在的一定能检索到

雪崩:同一时间大量数据请求数据库,导致数据库压力大而宕机。

解决办法:

  • 过期时间设置随机,避免同一时间多个缓存同时过期
  • 设置热点数据永不过期
  • 使用锁或队列的方式保证不会有大量线程对数据库一次性进行读写

  3.数据库优化 

一方面从sql优化、索引优化入手,另一方面从数据库的表设计方面入手。

对于sql优化、索引优化。具体包括以下几点:

  1. 利用好索引,避免全表扫描
  2. 优化子查询,使用inner join代替子查询
  3. 减少无效数据查询,使用select字段名来代替select  *

对于表设计方面包括:

  1. 尽量使用固定长度的字段
  2. 限制字段长度
  3. 分库分表

从IO角度考虑,还可以增加缓冲区

索引包括哪些?

  • 普通索引
  • 唯一索引
  • 主键索引
  • 联合索引

导致索引失效的几种情况:

  1. 遇到null值
  2. 模糊查询 xxx%
  3. 使用or
  4. 最左匹配原则
  5. where 1=1
  6. =前边有表达式或函数
  7. 使用!=
  8. 类型隐式转化,比如a是varchar类型,sql中写a=1这样

4.redis过期键的删除策论有哪些?

定时删除

通过使用定时器来删除,保证过期键尽可能的删除,并释放过期键占用的内存。

对内存友好,对CPU不友好。

惰性删除

获取键时对键进行过期检测,不会在删除其他无关过期键花费CPU

对CPU友好,对内存不友好

定期删除

定时删除和惰性删除的一种折中策略,每隔一段时间执行一次删除过期键操作

5.快速失败中,为什么在foreach的过程中,使用remove或者改变集合长度会抛异常

在使用迭代器Iterator的时候,调用集合本身的方法。多线程会导致数据不安全。

在循环或迭代中,首先会创建一个迭代实例,这个迭代实例的expectedModCount赋值为集合的modCount,每当迭代器使用next()获得下一个之前,会检测 modCount 变量与expectedModCount 值是否相等,相等的话就返回遍历;否则就抛出异常【ConcurrentModificationException】,终⽌遍历。

循环中添加或删除元素,是直接调用集合的add,remove方法【导致了modCount增加或减少】,但这些方法不会修改迭代实例中的expectedModCount,导致在迭代实例中expectedModCount 与 modCount的值不相等,抛出ConcurrentModificationException异常

6.mybatis分页是如何实现的?

通过page对象作为分页依据

通过count作为查询总条数限制

对原有sql通过limit进行分页

7.like %和like _的区别

%代表任意多个字符;_代表任意一个字符。

8.为什么redis最常用的数据类型是String

因为String类型的数据结构简单,存储空间占据小。我们知道redis缓存中的数据是要存到内存中的,而内存的空间毕竟有有限的,所以能用String时,尽量用String

9.POI和easyExcel的区别

POI是将内容先写到内存,再加载到文件;easyExcel是读一行解析一行

10.java的内存模型

java的内存模型分为工作内存和主内存。

工作内存是线程私有的,主内存是线程共享的。

当线程工作时,需要从主内存中拉取到自己的工作内存,在工作内存中读取和修改,当当前线程修改了共享变量后,其他线程不可见。这就导致了“内存不可见”问题。

上升到CPU是各级缓存与主内存不可见问题,采用缓存一致性来解决这个问题

java采用内存屏障来解决,即synchronized,volidate。volidate对线程共享资源修改后会立即同步到主内存,并且其他线程共享变量副本失效,使用时重新从主内存中拉取。

11.  三种线程池的适用场景

线程池的作用:

重复利用现有线程,避免线程多次创建与销毁。

fixedThreadPool:固定数量线程,核心线程数=最大线程数,阻塞队列是int最大值

适用于cpu计算密集的情况(cpu是调度线程的,cpu密集可以理解为程序一直在计算),因为cpu密集,再去创建线程已经顾不上了,所以固定数量的就足够了。

cachedThreadPool:可扩容数量线程池,核心线程数0,最大线程数为int的最大值

用到多少线程,创建多少。阻塞队列是0

适用于io密集的场景,io密集就会产生io阻塞,那么这是cpu就有空闲,这是就可以创建线程,以保证cpu尽可能多的使用。

singleThreadExecutor:核心线程数=最大线程数=1   单个线程,但是有阻塞队列

12.多线程的执行原理/拒绝策略的流程

线程池中有几个重要的参数:核心线程数,最大线程数,阻塞队列。

比如一个线程池的核心线程数是5,最大线程数是10,阻塞队列是1024。

首先核心线程数来处理任务,当任务数增加放入阻塞队列,其他任务等待核心线程处理完,当阻塞队列满了,就会判断核心线程数是否达到了最大线程数,如果没有,那么就会创建新线程到最大。如果这是阻塞队列满了,那么再来任务的时候,就会触发拒绝策略。

13. 接口权限控制

首次登录的时候会生成一个token,前端拿到token放到请求头中,以后每次的请求都需要携带token,后端判断前端带过来的与数据库或者缓存中的token是否一致,一致的话代表登录过了。

我们利用spring的aop在每个接口前建一个切面,切面统一执行判断token,记得过滤掉登录接口。

 

 

 

 

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

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

相关文章

[C++]string类的模拟实现和相关函数的详解

目录string总体架构具体实现默认成员函数构造函数构造拷贝函数析构函数赋值重载[]相关操作函数c_str() && size()reserve() && resize()push_back() && append()find()inserterase() && clear其余操作符重载< 、 <、 >、 >、 !<…

【系统集成项目管理工程师】项目整体管理

&#x1f4a5;十大知识领域&#xff1a;项目整体管理 项目整体管理包括以下 6 个过程: 制定项目章程定项目管理计划指导与管理项目工作监控项目工作实施整体变更控制结束项目或阶段过程 一、制定项目章程 制定项目章程。编写一份正式文件的过程&#xff0c;这份文件就是项目章程…

某程序员哀叹:月薪四五万,却每天极度焦虑痛苦,已有生理性不适,又不敢裸辞,怎么办?

高薪能买来快乐吗&#xff1f; 来看看这位程序员的哀叹&#xff1a; 实在是扛不住了&#xff0c;每天都在极度焦虑和痛苦中度过&#xff0c;早上起来要挣扎着做心理建设去上班&#xff0c;已经产生生理性的头晕恶心食欲不振。有工作本身的原因&#xff0c;更多是自己心态的问…

OpenCV+FFmpeg 实现人脸检测Rtmp直播推流(Python快速实现)

实现效果 windows平台笔记本摄像头视频采集、人脸识别&#xff0c;识别后将视频推流到RTMP流媒体服务器&#xff0c;在任意客户端可以进行RTMP拉流播放。 效果如图&#xff1a; 使用VLC播放器进行拉流。 准备工作 需要先安装OpenCV的python包以及FFmpeg。 对于ffmpeg有两…

Java——删除链表中重复的节点

题目链接 牛客在线oj题——删除链表中重复的节点 题目描述 在一个排序的链表中&#xff0c;存在重复的结点&#xff0c;请删除该链表中重复的结点&#xff0c;重复的结点不保留&#xff0c;返回链表头指针。 例如&#xff0c;链表 1->2->3->3->4->4->5 处…

【Vue】学习笔记-数据代理

数据代理 Object.defineproperty方法 <script type"text/javascript">let number18let person{name:张三,sex:男,}//age属性 不参与遍历Object.defineProperty(person,age,{//value:18,//enumerable:true, //控制属性是否可以枚举&#xff0c;默认值是false//…

科技成果评价最新攻略,你确定不来看看?

一、什么是科技成果评价&#xff1f; 是指按照委托者的要求&#xff0c;由具有评价资质的第三方专业机构聘请专家&#xff0c;坚持实事求是、科学民主、客观公正、注重质量、讲求实效的原则&#xff0c;依照规定的程序和标准&#xff0c;对被评价科技成果进行审查与辨别&#…

[Java Web]VUE | vue:一项Java Web开发中不可或缺的前端技术

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;Java Web ⭐如果觉得文章写的不错&#xff0c;欢迎点个关注一键三连&#x1f609;有写的不好的地方也欢迎指正&a…

AD19 基础应用技巧(快速定义PCB板框,CAD中DWG转DXF格式导入)

【B站一个假的攻城狮】导入CAD图纸到PCB&#xff0c;Altium Designer 21教程&#xff0c;第九节。 http://www.keyboard-layout-editor.com/ http://builder.swillkb.com/ 1、打开中望CAD&#xff0c;并打开一张图纸文件&#xff0c;为了能把孔表达清楚&#xff0c;开孔断面图…

React(六) —— redux

&#x1f9c1;个人主页&#xff1a;个人主页 ✌支持我 &#xff1a;点赞&#x1f44d;收藏&#x1f33c;关注&#x1f9e1; 文章目录⛳Redux&#x1f346;redux定义&#x1f490;redux使用原则&#x1f370;redux使用场景&#x1f9ca;redux工作流程&#x1f96b;redux基本创建…

14.创建组件

组件可以理解为页面的拼图块&#xff0c;一个完整的页面是由若干个组件拼成的 在vue中规定&#xff0c;组件的后缀名为vue&#xff0c;每一个vue文件中应该包含三个大标签 template 组件的模板结构&#xff0c;可以理解为htmlscript 组件的JS&#xff0c;控制组件要执行什么动…

区域检验管理系统(云LIS)源码

1、区域检验管理系统&#xff08;云LIS&#xff09;概述 云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序&#xff0c;可协助区域内所有临床实验室相互协调并完成日常检验工作&#xff0c;对区域内的检验数据进行集中管理和共享&#xff0c;通过对质量控制的管理&am…

Java每日一练(20230418)

目录 1. N皇后 II &#x1f31f;&#x1f31f;&#x1f31f; 2. 字符串相乘 &#x1f31f;&#x1f31f; 3. 买卖股票的最佳时机 &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一…

“Natural Earth II“ === “Natural Earth II“是false?你知道空 格的四种写法吗?

前言 有一回对我说道&#xff0c;“你学过前端么&#xff1f;”我略略点一点头。他说&#xff0c;“学过前端&#xff1f;……我便考你一考。html 里面的空格&#xff0c;怎样 coding 的&#xff1f;”我想&#xff0c;讨饭一样的人&#xff0c;也配考我么&#xff1f;便回过脸…

计算机网络 - 网络中的基本概念

前言 本篇介绍网络的一些基本概念&#xff0c;认识IP地址&#xff0c;端口号&#xff0c;协议&#xff1b;了解常用的网络协议模型&#xff0c;知道数据如何封装与分用的&#xff1b;为以后学习计算机网络其它知识做铺垫&#xff0c;如有错误&#xff0c;请在评论区指正&#…

Java数据结构 二叉树基本知识 二叉树遍历

二叉树很简单的&#xff0c;试试呗~ 文章目录 Java数据结构 & 二叉树基本知识 & 二叉树遍历1. 树的基本定义2. 树的基本概念2.1 例子2.2 树的代码表示&#xff1a; 3. 二叉树3.1 特殊节点3.2 特殊的二叉树3.3 二叉树的性质3.3.1 证明第三点3.3.2 证明第四点 4. 二叉树遍…

MySQL-MHA高可用(一)

目录 &#x1f341;同步概念 &#x1f341;工作原理 &#x1f343;环境拓扑 &#x1f341;环境准备 &#x1f342;manager &#x1f342;master1 &#x1f342;master2 &#x1f342;slave &#x1f343;配置半同步复制 &#x1f341;master1 &#x1f341;master2 &#x1f34…

函数 tcgetpgrp tcsetpgrp 和 tcgetsid

① tcgetpgrp & tcsetpgrp 函数 tcgetpgrp函数是用来获取前台进程组的ID #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> int main() {printf("我的ID&#xff1a;%d---我…

【MySQL学习】MySQL库的操作

目录一、查看数据库的连接二、数据库的创建三、字符集和校验规则3.1 查看数据库默认的字符集以及校验规则3.2 查看数据库支持的字符集以及校验规则3.3 校验规则对数据库的影响四、操纵数据库4.1 查看数据库4.2 显示创建语句4.3 修改数据库4.4 数据库的删除五、数据库的备份与恢…

Nginx中的location规则与rewrite

nginx正则表达式 ^$空行 \d数字 \D代表非数字 \s 匹配空白符 \S 非空白字符 \w匹配任意单词符包括下划线[A-Za-z0-9_] {n} 匹配起那面字符n次 .* 除换行符\n匹配任意字符多次 {n,m}匹配前面字符5到10次 [abc] 匹配一次a,b,c ( )表达式的开始和结束 | 或运算符 &#…