2021常见面试题汇总(持续更新)

2023-11-19

1.Valatile的定义和使用?

1.保持变量在不同线程之间的可见性
2.放在指令重排序(有序性)

1.1 可见性

在这之前我们要大致了解一下java的内存模型
在这里插入图片描述
每一个线程都会有一个独立的工作内存,线程不会直接操作主内存中的变量。而是将主内存的变量存一份副本在自己线程中的工作内存中,只会操作自己工作内存中的变量,修改完毕后再将修改后的结果存入主内存中。
在上述流程中在单线程中不会存中问题,在多线程中可能出现脏数据的问题,两个线程都拿到了主内存的数据都进行了操作,导致了数据错误。
所以Valatile的第一个作用就是: 自己在工作内存中如果修改了valatile修饰的变量,那么会直接刷新到主内存中且其他工作内存中的该变量都直接失效,需要强制重新从主内存中拉取,这样来保证可见性。

1.2 有序性

排序。比方说下面的代码:

int i = 1;
int j = 2;

上述的两条赋值语句在同一个线程之中,根据程序上的次序,“int i = 1;”的操作要先行发生于“int j = 2;”,但是“int j = 2;”的代码完全可能会被处理器先执行。JVM会保证在单线程的情况下,重排序后的执行结果会和重排序之前的结果一致。但是在多线程的场景下就不一定了。最典型的例子就是双重检查加锁版的单例实现,代码如下所示:

public class Singleton {
 
    private volatile static Singleton instance;
 
    private Singleton() {}
 
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

由上可以看到,instance变量被volatile关键字所修饰,但是如果去掉该关键字,就不能保证该代码执行的正确性。这是因为“instance = new Singleton();”这行代码并不是原子操作,其在JVM中被分为如下三个阶段执行:

  1. 为instance分配内存
  2. 初始化instance
  3. 将instance变量指向分配的内存空间

由于JVM可能存在重排序,上述的二三步骤没有依赖的关系,可能会出现先执行第三步,后执行第二步的情况。也就是说可能会出现instance变量还没初始化完成,其他线程就已经判断了该变量值不为null,结果返回了一个没有初始化完成的半成品的情况。
volatile的第二个作用而加上volatile关键字修饰后,可以保证instance变量的操作不会被JVM所重排序,每个线程都是按照上述一二三的步骤顺序的执行,这样就不会出现问题。
本段转载于:https://blog.csdn.net/weixin_30342639/article/details/91356608

2.syc1.8之后有什么区别

在这里插入图片描述
简单来说:

1.对象创建出来是无锁;
2.第一个线程访问它,就变成偏向锁
3.再有其他线程来访问,就有了竞争,升级为cas;
4.cas转几次,说明竞争比较激烈,升级为重量级锁。

整个过程是单向的不可逆

在这里插入图片描述
具体请看:Synchronized底层实现

3.synchronized和Lock的区别

  • synchronized是关键字,是JVM层面的底层啥都帮我们做了,而Lock是一个接口,是JDK层面的有丰富的API。

  • synchronized会自动释放锁,而Lock必须手动释放锁。

  • synchronized是不可中断的,Lock可以中断也可以不中断。

  • 通过Lock可以知道线程有没有拿到锁,而synchronized不能。

  • synchronized能锁住方法和代码块,而Lock只能锁住代码块。

  • Lock可以使用读锁提高多线程读效率。

  • synchronized是非公平锁,ReentrantLock可以控制是否是公平锁。

4.redis如何进行大key或value值删除

1个大小200MB的String键(String Object最大512MB),内存空间占用较大;1个包含100000000(1kw)个字段的Hash键,对应访问模式(如hgetall)时间复杂度高

我们一般来说前一种内存占用大的不太会影响我们的删除效率,但后一种的时间复杂度较高的情况下,我们在删除的时候会阻塞我们redis数十秒(单线程)。
解决方式:
1.尽量不要存储这种大建,删除时会造成程序阻塞
2.通过scan命令来进行分段删除,比如每次500个key值
3.Redis 3.4版本开始,Redis会支持lazy delete free的方式,删除大键的过程不会阻塞正常请求。就是使用UNLINK,UNLINK其实是直接返回,然后在后台线程慢慢删除

(lazy free的本质就是把某些cost(主要时间复制度,占用主线程cpu时间片)较高删除操作,从redis主线程剥离,让bio子线程来处理,极大地减少主线阻塞时间。从而减少删除导致性能和稳定性问题。)

5.redis如何进行模糊搜索

含有两个参数:scan、keys都可以进行模糊搜索。

5.1使用keys进行模糊搜索

redis中有三个通配符 * ?[]

  • *: 通配任意多个字符
  • ?: 通配单个字符
  • []: 通配括号内的某1个字符

存在问题:在模糊遍历查找期间,造成无法接受其他的get,set请求,造成缓存服务不可用

5.2使用scan进行模糊搜索

对比KEYS命令,虽然SCAN无法一次性返回所有匹配结果,但是却规避了阻塞系统这个高风险,从而也让一些操作可以放在主节点上执行。

命令:SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
scan提供4个参数,第一个是 cursor 整数值,第二个是 key 的正则模式,第三个是遍历的 limit hint。第一次遍历时,cursor 值为 0,然后将返回结果中第一个整数值作为下一次遍历的 cursor。一直遍历到返回的 cursor 值为 0 时结束

6.mysql的事物隔离级别

7.jvm如何进行调优

8.JVM如何保证永远不full gc

9.Spring容器启动流程

10.Spring如何实现IOC

11.MQ实现防重复消费

12.MQ实现顺序消费

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2021常见面试题汇总(持续更新) 的相关文章

  • 【面试专题】Spring篇②

    个人主页 个人主页 系列专栏 Java面试专题 目录 1 spring bean的循环依赖 2 springMVC执行流程 3 Springboot自动配置原理 4 Spring框架常见的注解 Spring SpringMVC Spring
  • 2020前端实习大厂面试经验汇总(秋招加油!)

    这篇文章主要介绍了前端实习大厂的面试经验 主要包含了7个公司 华为 欢聚 京东 酷狗 美的 腾讯 网易 公司不分先后 感兴趣的朋友可以了解一下 祝大家秋招顺利 offer到手 华为CBG 通用软件开发 4 21 华为技术一面 45分钟 手撕
  • ThreadLocal 原理 总结

    1 首先看了 Java并发编程 深入剖析ThreadLocal 这篇文章 这篇文章首先用用一个数据库连接的例子 如多个线程同时进行连接和关闭数据库操作 有可能会导致某个线程刚打开的数据库连接操作 被另一个线程打开的数据库关闭操作给关闭了 然
  • Java基础-对象的内存分配与初始化(一定要明白的干货)

    参考 https www cnblogs com wxw7blog p 7349204 html 首先 什么是类的加载 类的加载由类加载器执行 该步骤将查找字节码 classpath指定目录 并从这些字节码中创建一个Class对象 Java
  • Java面试八股文宝典:序言

    序言 Java作为一门广泛应用于企业级应用开发的编程语言 一直以来都是技术面试中的重要话题 无论您是刚刚踏入编程世界的新手 还是经验丰富的Java开发工程师 都需要通过面试来展示自己的技能和知识 在面试中 除了技术知识 还需要展现出解决问题
  • 简历造假,你以为我不知道?

    本文共 3495字 预估阅读时间 9分钟 前言 上到职场干将下到职场萌新 都会接触到包装简历这个词语 当你简历投到心仪的公司 公司内负责求职的工作人员是如何甄别简历的包装程度的 Coody老师根据自己的经验写下了这篇文章 谁都不是天才 包装
  • 面试进阶必问的Redis,看这篇就够了!

    出自 https github com CyC2018 CS Notes 一 概述 二 数据类型 STRING LIST SET HASH ZSET 三 数据结构 字典 跳跃表 四 使用场景 计数器 缓存 查找表 消息队列 会话缓存 分布式
  • 【2021最新版】Java多线程&并发面试题总结(108道题含答案解析)

    文章目录 JAVA并发知识库 1 Java中实现多线程有几种方法 2 继承Thread类 3 实现Runnable接口 4 ExecutorService Callable Future有返回值线程 5 基于线程池的方式 6 4 种线程池
  • Synchronized和ReentrantLock的区别

    1 Synchronized是一个关键字 ReentrantLock是一个类 2 Synchronized可以用来修饰普通方法 静态方法和代码块 而ReentrantLock只能用于代码块 3 Synchronized会自动加锁与释放锁 R
  • 【Java设计模式】这么详细,你还不懂建造者模式嘛!

    我是清风 每天学习一点点 快乐成长多一点 这些都是我的日常笔记以及总结 目录 建造者 建造者模式和工厂模式区别 业务场景 UML类图 源码解析 StringBuilder 源码分析 SringBuffer 开源框架 spring中BeanD
  • LeetCode (二)找出数组中多于半数的数字

    题目 给定一个大小为 n 的数组 找到其中的多数元素 多数元素是指在数组中出现次数 大于 n 2 的元素 解法 自己的解法 思路 for循环遍历存Map 记录key对应的Count 如果大于半数 返回 package com jzj stu
  • Java面试:Java中==与equals的区别

    比较的是两个引用在内存中指向的是不是同一对象 即同一内存空间 也就是说在内存空间中的存储位置是否相同 引用类型 如果两个对象的引用指向同一内存空间 操作符返回true 否则返回flase public class Test public s
  • 对象在内存中的初始化过程

    参考 1 https blog csdn net WantFlyDaCheng article details 81808064 2 深入理解java虚拟机 Student s new Student 为例 1 首先查看类的符号引用 看是否
  • Java 线程同步 - 7种方式

    为何要使用同步 java允许多线程并发控制 当多个线程同时操作一个可共享的资源变量时 如数据的增删改查 将会导致数据不准确 相互之间产生冲突 因此加入同步锁以避免在该线程没有完成操作之前 被其他线程的调用 从而保证了该变量的唯一性和准确性
  • 一位老学长的真实互联网校招求职心路历程~

    自我介绍 听说很多家公司2019年的春招已经陆续开始了 作为一个备战过2018年春招和秋招的求职狗 想来聊一下自己的校招求职经历 我本科是哈尔滨的一所211大学 万年老二 学的是电子信息工程 由于当年高考发挥失常 自己又不想复读 所以从入学
  • 线程的生命周期 笔记

    1 新建 new Thread 进入此状态 2 Thread start 进入就绪状态 或者 在运行状态执行yield 放弃CPU的执行转到就绪状态 或者是阻塞状态转入 3 阻塞状态 sleep 同步锁获取失败进入阻塞状态 执行了wait方
  • 华为OD机试(JAVA)真题 2023(汽水瓶\随机数\进制转换)

    系列文章目录 文章目录 系列文章目录 前言 一 1 汽水瓶 二 明明的随机数 前言 一 1 汽水瓶 某商店规定 三个空汽水瓶可以换一瓶汽水 允许向老板借空汽水瓶 但是必须要归还 小张手上有n个空汽水瓶 她想知道自己最多可以喝到多少瓶汽水 数
  • 简单对比一下Cookie和Session的主要区别

    一句话总结 Cookie是检查用户身上的 通行证 来确认用户的身份 Session就是通过检查服务器上的 客户明细表 来确认用户的身份的 Session相当于在服务器中建立了一份 客户明细表 注释 300 20 4kb
  • 漫画:什么是 CAS 机制?

    https blog csdn net bjweimengshu article details 78949435点击上方 程序员小灰 选择 置顶公众号 有趣有内涵的文章第一时间送达 第二天
  • 场景题

    场景题 1 场景题汇总 1 情景题 如果一个外卖配送单子要发布 现在有200个骑手都想要接这一单 如何保证只有一个骑手接到单子 2 场景题 美团首页每天会从10000个商家里面推荐50个商家置顶 每个商家有一个权值 你如何来推荐 第二天怎么

随机推荐

  • Swift语法学习--字符&字符串

    Swift语法学习 字符 字符串
  • 疯壳AI语音及人脸识别3-4AI人脸系统架构

    详情地址 https fengke club GeekMart views offline ai 购买链接 https fengke club GeekMart su fKw7Nb7oC jsp 视频地址 https fengke club
  • sql修改一列或所有列的表类型和注释

    一列 ALTER TABLE cspg mp db mp device electric consumption statistics 1d MODIFY COLUMN electric double 20 2 NULL COMMENT 电
  • 链表面试题(一):反转链表的算法实现

    关于链表的考察 链表是面试里面经常涉及到的考点 因为链表的结构相比于Hashmap Hashtable Concurrenthashmap或者图等数据结构简单许多 对于后者更多面试的侧重点在于其底层实现 比如Hashmap中Entry
  • Python基础语法:数据分析利器

    欢迎来到我的博客 作者 秋无之地 简介 CSDN爬虫 后端 大数据领域创作者 目前从事python爬虫 后端和大数据等相关工作 主要擅长领域有 爬虫 后端 大数据开发 数据分析等 欢迎小伙伴们点赞 收藏 留言 上一篇文章已经跟大家介绍过 数
  • Jquery ligerui下拉框复选,使下拉框中相应值对勾选中

    othertypeCombox ligerGetComboBoxManager selectValue 1 2 3 4 othertypeCombox ligerGetComboBoxManager bulidContent 必须加上后一行
  • python创意实用案例-9个 Python 实用案例分享

    1 整理字符串输入 整理用户输入的问题在编程过程中极为常见 通常情况下 将字符转换为小写或大写就够了 有时你可以使用正则表达式模块 Regex 完成这项工作 但是如果问题很复杂 可能有更好的方法来解决 user input This str
  • 让你不得不学Python 的十大重要理由

    简单易学 Python是一种代表简单主义思想的语言 阅读一个良好的Python程序就感觉像是在读英语一样 它使你能够专注于解决问题而不是去搞明白语言本身 Python极其容易上手 因为Python有极其简单的说明文档 速度快 Python
  • 模拟实现 队列 - JAVA(使用链表,数组)

    以链表实现 以数组实现 以链表实现 class Node public int val public Node next public Node int val this val val public class MyQueue publi
  • Java堆的自动垂直缩放

    多年以来 java一直是贪婪的应用程序的同义词 这种类型的应用程序在晚上打开冰箱并吞噬所有可用资源 直到崩溃 该行为的主要原因是缺乏一种有效的方式来将操作系统在Java堆中分配且不再使用的内存交还给操作系统 However with the
  • Ansible Ad-Hoc与常用模块

    ansible 执行结果信息 各颜色说明 ansible Ad Hoc 说明 ansible 如何查看帮助文档与常用模块详解 主机规划 主机名称 操作系统版本 内网IP 外网IP 模拟 安装软件 ansi manager CentOS7 5
  • 【Python】自动化构建项目结构样式

    引言 在使用Python或者其它编程语言的项目时候 编写README md 往往是不可或缺的 而在README md 中 关于项目结构的样式展示 这个是可选的 不展示也无伤大雅 但有展示的话 有以下优点 提供清晰的项目导航 包含项目结构的文
  • A deep learning approach to detection of splicing and copy-move forgeries in images

    https github com kPsarakis Image Forgery Detection CNNhttps github com kPsarakis Image Forgery Detection CNN 代码是结合代尔夫特理工
  • Python报错: Using TensorFlow backend

    Python报错 Using TensorFlow backend 环境 系统 win10 pycharm2017 问题描述 导入keras库运行时 Python总是出现Using TnesorFlow backend报错 解决过程 网上有
  • android-smart-image-view源码分析,android性能优化推荐书

    三 源码分析 从github上clone该项目 可以看到整个项目的代码只包含7个Java源文件 同时 还可进行扩展 方便使用者根据实际图片的来源进行扩展 我们来看看Class逻辑图 上面有提到 SmartImageView继承自ImageV
  • python 从外部引入变量并运行该程序

    1 python程序部分 import argparse FLAGS tf app flags FLAGS office31 flags train parser argparse ArgumentParser parser add arg
  • java自动化测试框架基础eclipse+maven配置

    java自动化测试框架基础eclipse maven配置 文章目录 java自动化测试框架基础eclipse maven配置 一 maven安装配置 二 eclipse中使用maven 一 maven安装配置 Maven是一个项目构建和管理
  • IDEA安装及配置

    目录 下载与安装 IDEA文件目录介绍 IDEA优化配置 提高启动和运行 下载与安装 IDEA下载网址 JetBrains Essential tools for software developers and teams 在官网中找到自己
  • make: *** No rule to make target 错误原因、分析和解决办法

    问题描述 在用codewarrior编译的时候 遇到编译器报如下错误 mingw32 make No rule to make target D CW Workspace Renalt PBG BOOT Project Settings L
  • 2021常见面试题汇总(持续更新)

    2021常见面试题汇总 1 Valatile的定义和使用 1 1 可见性 1 2 有序性 2 syc1 8之后有什么区别 3 synchronized和Lock的区别 4 redis如何进行大key或value值删除 5 redis如何进行