面试系列
文章平均质量分 90
主要用于Java面试相关的技术点
后端技术那点事
这个作者很懒,什么都没留下…
展开
-
JUC系列(六)
1、AbstractQueuedSynchronizer之AQSAbstractQueuedSynchronizer简称为AQS,抽象的队列同步器AQS:是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石,使用一个int类变量表示持有锁的状态,通过内置的FIFO队列来完成资源获取线程的排队工作,将每条要去抢占资源的线程封装成一个Node节点来实现锁的分配,通过CAS完成对State值的修改。1.1、自定义同步组件的设计思路同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象原创 2022-04-07 11:18:02 · 1421 阅读 · 0 评论 -
JUC系列(五)
1、ThreadLocal1.1、什么是ThreadLocal线程局部变量。1.2、ThreadLocal的作用以及可以为什么保证线程安全?多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,每一个线程在访问ThreadLocal实例的时候,都有自己的、独立初始原创 2022-04-05 18:18:21 · 1042 阅读 · 0 评论 -
JUC系列(四)
1、CAS1.1、没有CAS之前,保证线程安全的方式多线程环境不使用原子类保证线程安全(基本数据类型)public class T3{ volatile int number = 0; //读取 public int getNumber() { return number; } //写入加锁保证原子性 public synchronized void setNumber() { number++;原创 2022-04-04 23:39:51 · 569 阅读 · 1 评论 -
JUC系列(三)
1、Java内存模型1.1、什么是Java内存模型JMM?JMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念并不真实存在,它仅仅描述的是一组约定或规范,通过这组规范定义了程序中(尤其是多线程)各个变量(包括实例字段,静态字段和构成数组对象的元素)的读写访问方式。JMM关于同步的规定:线程解锁前,必须把共享变量的值刷新回主内存线程加锁前,必须读取主内存的最新值,到自己的工作内存加锁和解锁是同一把锁JMM规范有三大特性:可见性:可见性是指当一个线程原创 2022-04-02 16:17:51 · 1603 阅读 · 0 评论 -
JUC系列(二)
1、聊一聊Java“锁”1.1、乐观锁和悲观锁悲观锁:认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。synchronized关键字和Lock的实现类都是悲观锁。适合写操作多的场景,先加锁可以保证写操作时数据正确,显式的锁定之后再操作同步资源。乐观锁:乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据原创 2022-03-30 21:22:50 · 698 阅读 · 0 评论 -
JUC系列(一)
1、为什么多线程极其重要? 多线程变得极其重要的原因从软硬件两个方面来说,首先硬件方面:主要是摩尔定律失效,它是由英特尔创始人之一Gordon Moore(戈登·摩尔)提出来的,其内容是当价格不变时,将每隔18个月,性能也将提升一倍(当价格不变时,集成电路上可容纳的元器件的数目约每隔18-24个月便会增加一倍,性能也将提升一倍,换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上,这一定律揭示了信息技术进步的速度),但是可是从2003年开始CPU主频已经不再翻倍,而是采用多核而不是更快的主原创 2022-03-28 14:33:30 · 1583 阅读 · 0 评论 -
JUC相关知识详解
JUC和JVM相关1、JMM (java 内存模型)1.1、什么是JMM? JMM 本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式1.2、JMM关于同步的规定:线程解锁前,必须把共享变量的值刷新回主内存线程加锁前,必须读取主内存的最新值到自己的工作内存加锁解锁是同一把锁[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jjPZhKaS-16177039571原创 2021-04-06 18:14:39 · 525 阅读 · 0 评论 -
线程8锁问题
1、线程8锁问题1.1、代码/* * * 资源类 */class Resource { public static synchronized void sendEmail() { try { TimeUnit.SECONDS.sleep(3); System.out.println("*******sendEmail"); } catch (InterruptedException e) {原创 2022-03-17 15:31:40 · 235 阅读 · 0 评论 -
自定义线程池、线程池的底层原理以及线程8锁问题
1、线程池1.1、什么是线程池?线程池就是创建若干个可执行的线程放入一个池(容器)中,有任务需要处理时,会提交到线程池中的任务队列,处理完之后线程并不会被销毁,而是仍然在线程池中等待下一个任务1.2、为什么要使用线程池?降低资源消耗。通过重复利用己创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。提高线程的可管理性。使用线程池可以进行统一的分配,调优和监控。1.3、线程池的创建方式使用Executor创建线程池 newF原创 2022-03-19 18:18:29 · 367 阅读 · 0 评论 -
HIVE常见面试题以及实战练习(六)
HIVE常见面试题和实战练习原创 2022-08-07 12:58:55 · 959 阅读 · 0 评论 -
JVM系列之故障排查与性能调优(重点)
JVM性能排查原创 2022-05-17 13:45:08 · 1683 阅读 · 0 评论 -
JVM系列之Class文件结构、字节码指令集
1、Class文件结构Java语言:跨平台的语言(write once,run anywhere),当Java源代码成功编译成字节码后,如果想在不同的平台上面运行, 则无须再次编译,这个优势不再那么吸引人了。Python、PHP、Perl、Ruby、Lisp等有强大的解释器,跨平台似乎已经快成为一门语言必选的特性Java虚拟机:跨语言的平台Java虚拟机不和包括Java在内的任何语言绑定,它只与.class文件这种特定的二进制文件格式所关联,无论使用何种语言进行软件开发, 只要能将源文件编译为正确的.原创 2022-05-16 16:33:32 · 625 阅读 · 0 评论 -
JVM系列之垃圾回收器
1、垃圾回收器如果说垃圾收集算法是内存回收的方法论,那垃圾收集器就是内存回收的实践者1.1、GC分类与性能指标1.1.1、垃圾回收器分类1.1.1.1、按垃圾回收线程数(串行和并行)串行垃圾回收器:串行回收指同一个时间段内,只允许一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直到垃圾收集工作结束,在单CPU处理器或者较小应用内存等硬件平台不是特别优越的场合,串行回收器的性能表现可以超过并行回收器和并发回收器。所以串行回收默认被应用在客户端的client模式下的JVM中,在并发能力比较强的原创 2022-05-16 14:12:40 · 510 阅读 · 0 评论 -
JVM系列之垃圾回收算法
1、JVM垃圾回收1.1、垃圾回收概述Java和c++在内存方面的区别(内存动态分配、垃圾自动回收)1.1.1、垃圾回收技术需要考虑的三个基本问题哪些内存需要回收?什么时候需要回收内存?如何回收内存?1.1.2、什么是垃圾垃圾是指运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾,如果不及时对内存中的垃圾进行清理,那么这些垃圾对象所占用的内存空间会一直保留直到应用程序结束,被保留的空间无法被其他对象使用,最终甚至可能导致内存溢出。1.1.3、需要回收的内存区域回收的区域原创 2022-05-16 00:52:54 · 1775 阅读 · 0 评论 -
JVM系列之HotSpot虚拟机对象、字节码执行引擎、StringTable
1、对象的实例化、内存布局与对象的访问定位1.1、对象的实例化1.1.1、创建对象的方式new :最常见的方式,变形:Xxx的静态方法,XxxBuilder/XxxFactory的静态方法Class的newInstance:JDK9标记过时,反射的方式,只能调用空参的构造器,权限必须是publicConstructor的newInstance:反射的方式,可以调用空参,带参的构造器,权限没有要求使用clone:不调用任何构造器,当前类需要实现Cloneable接口,实现clone()方法使用原创 2022-05-15 14:50:42 · 444 阅读 · 0 评论 -
JVM系列之运行时数据区
1、运行时数据区Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域虚拟机栈、堆内存、程序计数器、方法区、本地方法栈虚拟机栈、本地方法栈、程序计数器为线程私有方法区、堆内存为线程共享1.1、程序计数器(Program Counter R原创 2022-05-14 23:47:21 · 1239 阅读 · 0 评论 -
JVM系列之类加载子系统
1、类加载器与类的加载过程1.1、类加载器1.1.1、类加载器子系统的作用负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识,魔术,CA FA BA BEClassloader只负责class文件的加载,至于是否可运行,则由执行引擎决定加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射),常量池运行时加载到内存中,即运行时常量池原创 2022-05-14 13:44:47 · 222 阅读 · 0 评论 -
spring-cloud-sleuth整合zipkin
1、Sleuth(全链路追踪)1.1、概要Spring Cloud Sleuth提供了一套完整的服务跟踪的解决方案,并且支持集成了zipkin。1.2、术语1.2.1、Trace:它是由一组有相同Trace ID的Span串联形成一个树状结构。为了实现请求跟踪,当请求到分布式系统的入口端点时,只需要服务跟踪框架为该请求创建一个唯一的跟踪标识(即前文提到的Trace ID),同时在分布式系统内部流转的时候,框架始终保持该传递的唯一标识,直到返回请求为止,我们通过它将所有请求过程中的日志关联起来;1原创 2021-03-30 19:10:14 · 535 阅读 · 0 评论 -
秒杀场景分析以及案例实现
1、秒杀活动1.1、定时任务/** * 定时任务 * 1、@EnableScheduling 开启定时任务 * 2、@Scheduled开启一个定时任务 * * 异步任务 * 1、@EnableAsync:开启异步任务 * 2、@Async:给希望异步执行的方法标注 */@Slf4j@Component@EnableAsync@EnableSchedulingpublic class HelloScheduled { /**原创 2021-03-30 14:44:52 · 942 阅读 · 0 评论 -
RabbitMQ详解
rabbitmq详解原创 2022-05-11 13:41:16 · 4121 阅读 · 0 评论 -
springboot 单点登录
1、springboot 单点登录单点登录英文全称Single Sign On,简称就是SSO。它的解释是:在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统2、流程图3、流程解析现在有认证服务器 ssoserver.com,客户端client1.com和客户端client2.com 两个不同域名的服务器,并且没有子域名关系(如果两个客户端有子域名关系,session进行统一存储,可以通过SpringSession手动去设置session的作用域,放大作用域,取父域名最为原创 2021-03-26 15:41:18 · 6116 阅读 · 0 评论 -
设计模式系列
因为代码比较多,可以下载设计模式案例代码查看,以上是设计模式代码的案例目录代码下载1、设计模式的七大原则1.1、单一职责原则 (Single Responsibility Principle)一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a class to change)简单来说指的是每个类只负责自己的事情,而不是变成万能1.2、开放-关闭原则 (Open-Closed Principl.原创 2022-05-02 13:00:02 · 250 阅读 · 0 评论 -
Mysql高级部分系列(七)
1、多版本并发控制1.1、什么是MVCCMVCC (Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC 是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。1.2、快照读与当前读MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的原创 2022-04-30 12:32:41 · 1526 阅读 · 0 评论 -
Mysql高级部分系列(六)
1、MySQL锁锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题,当多个线程并发访问某个数据的时候,尤其是针对一些敏感的数据(比如订单、金额等),我们就需要保证这个数据在任何时刻最多只有一个线程在访问,保证数据的完整性和一致性。在开发过程中加锁是为了保证数据的一致性,这个思想在数据库领域中同样很重要。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对 并发操作进行控制 ,因此产生了锁 。原创 2022-04-26 13:48:25 · 1745 阅读 · 0 评论 -
Mysql高级部分系列(五)
1、事务基础知识事务是数据库区别于文件系统的重要特性之一,当我们有了事务就会让数据库始终保持一致性,同时我们还能通过事务的机制恢复到某个时间点,这样可以保证已提交到数据库的修改不会因为系统崩溃而丢失。1.1、数据库事务概述1.1.1、基本概念事务: 一组逻辑操作单元,使数据从一种状态变换到另一种状态。事务处理的原则: 保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么原创 2022-04-24 14:11:01 · 822 阅读 · 0 评论 -
Mysql高级部分系列(四)
在关系型数据库中,关于数据表设计的基本原则、规则就称为范式。可以理解为,一张数据表的设计结构需要满足的某种设计标准的级别。要想设计一个结构合理的关系型数据库,必须满足一定的范式。有的时候不能简单按照规范要求设计数据表,因为有的数据看似冗余,其实对业务来说十分重要。这个时候,我们就要遵循业务优先的原则,首先满足业务需求,再尽量减少冗余。如果数据库中的数据量比较大,系统的UV和PV访问频次比较高,则完全按照MySQL的三大范式设计数据表,读数据时会产生大量的关联查询,在一定程度上会影响数据库的读性能。...原创 2022-04-19 21:52:48 · 3551 阅读 · 3 评论 -
Mysql高级部分系列(三)
1、索引优化与查询优化都有哪些维度可以进行数据库调优?简言之:索引失效、没有充分利用到索引――索引建立关联查询太多JOIN(设计缺陷或不得已的需求)——SQL优化服务器调优及各个参数设置(缓冲、线程数等)—―调整my.cnf数据过多――分库分表关于数据库调优的知识点非常分散。不同的DBMS,不同的公司,不同的职位,不同的项目遇到的问题都不尽相同。这里我们分为三个章节进行细致讲解。虽然SQL查询优化的技术有很多,但是大方向上完全可以分成物理查询优化和逻辑查询优化两大块。物理查询优化是通过索原创 2022-04-18 15:36:58 · 1697 阅读 · 1 评论 -
Mysql高级部分系列(二)
1、索引的数据结构1.1、索引概述MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。索引的本质: 索引是数据结构。简单理解为“排好序的快速查找数据结构”,满足特定查找算法。这些数据结构以某种方式指向数据, 这样就可以在这些数据结构的基础上实现高级查找算法。索引是在存储引擎中实现的,因此每种存储引擎的索引不一定完全相同,并且每种存储引擎不一定支持所有索引类型。同时,存储引擎可以定义每个表的最大索引数和最大索引长度。所有存储引擎支持每个表至少16个索引,总索引长度至原创 2022-04-16 22:58:45 · 1618 阅读 · 1 评论 -
Mysql高级部分系列(一)
1、Mysql逻辑架构剖析1.1、服务器处理客户端请求服务器进程对客户端进程发送的请求做了什么处理,才能产生最后的处理结果呢?这里以查询请求为例展示:更具体一些则是当一个客户端请求向mysql服务器发起请求的时候,会先与服务器建立 TCP 连接,经过三次握手建立连接成功后, MySQL 服务器对 TCP 传输过来的账号密码做身份认证、权限获取,TCP 连接收到请求后,从连接池中分配给一个线程专门与这个客户端的交互。接着会进入sql接口部分,接收用户的SQL命令,并且返回用户需要查询的结果,在查原创 2022-04-15 20:35:48 · 4727 阅读 · 0 评论 -
kafka原理以及源码分析
1、什么是kafka以及kafka的基础架构Kafka是一个高吞吐的分布式的消息系统,是基于发布/订阅模式的消息队列。2、 术语Producer:消息生产者,就是向 Kafka broker 发消息的客户端。Consumer:消息消费者,向 Kafka broker 拉取消息的客户端。Consumer Group(CG):消费者组,由多个 consumer 组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,原创 2022-04-14 23:21:58 · 5665 阅读 · 1 评论 -
JVM系列之性能调优案例
1、调优基本问题1.1、为什么要调优?删除线格式 防止出现OOM,进行JM规划和预调优解决程序运行中各种OOM减少Full GC出现的频率,解决运行慢、卡顿问题1.2、调优的大方向合理地编写代码充分并合理的使用硬件资源合理地进行JVM调优1.3、不同阶段的考虑上线前项目运行阶段线上出现OOM1.4、调优监控的依据运行日志异常堆栈GC日志线程快照堆转储快照1.5、性能优化的步骤1.5.1、第1步:熟悉业务场景1.5.2、第2步(发现问题)︰性能监控一原创 2022-04-13 23:39:46 · 1070 阅读 · 1 评论 -
Redis系列(六)
1、案例实战:微信抢红包以及宝购物分享短连接推广1.1、案例实战:微信抢红包1.1.1、需求分析各种节假日,发红包+抢红包,不说了,100%高并发业务要求,不能用mysql来做一个总的大红包,会有可能拆分成多个小红包,总金额=分金额1+分金额2+分金额3…分金额N每个人只能抢一次,你需要有记录,比如100块钱,被拆分成10个红包发出去,总计有10个红包,抢一个少一个,总数显示(10/6)直到完,需要记录那些人抢到了红包,重复抢作弊不可以。有可能还需要你计时,完整抢完,从发出到全部over,耗时原创 2022-04-13 13:09:56 · 3041 阅读 · 0 评论 -
Redis系列(五)
1、Redis 与MySQL数据双写一致性工程落地案例你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?双写一致性,你先动缓存redis还是数据库mysql哪一个?whby?1.1、概要canal ,主要用途是用于MySQL数据库增量日志数据的订阅、消费和解析,是阿里巴巴开发并开源的,采用Java语言开发,历史背景是早期阿里巴巴因为杭州和美国双机房部署,存在跨机房数据同步的业务需求,实现方式主要是基于业务trigger(触发器)获原创 2022-04-12 15:55:34 · 561 阅读 · 0 评论 -
Redis系列(四)
1、redis经典五种数据类型及底层实现1.1、redis分布式锁的实现,其他方式了解吗,对比redis、zk实现分布式锁,这三个从实现方式上和锁竞争上有什么不同?redis按照一个key是否过期+lua脚本实现以及官网推荐redlock算法的落地产品redissonzookeeper按照一个zk里面只可以有且仅有一个znode节点,加锁成功就是建立一个节点,时间到期使用完了,自动删除该节点两个为了避免单点故障,一般3台机器,zk集群是全体同步才返回消息,redis集群异同通知,容易出现mater原创 2022-04-12 00:59:18 · 1470 阅读 · 0 评论 -
Redis系列(三)
1、分布式锁锁的种类:单机版同一个JVM虚拟机内,synchronized或者Lock接口分布式不同个JVM虚拟机内,单机的线程锁机制不再起作用,资源类在不同的服务器之间共享了。1.1、谈谈你对分布式锁的认知和理解独占性:OnlyOne,任何时刻只能有且仅有一个线程持有。高可用:若redis集群环境下,不能因为某一个节点挂了而出现获取锁和释放锁失败。防死锁:杜绝死锁,必须有超时控制机制或者撤销操作,有个兜底终止跳出方案。不乱抢:防止张冠李戴,不能私下unlock别人的锁,只能自己加锁自原创 2022-04-11 12:05:52 · 851 阅读 · 0 评论 -
redis系列(二)
1、布隆过滤器BloomFilter需求:现有50亿个电话号码,现有10万个电话号码,如何要快速准确的判断这些电话号码是否已经存在?布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的,它实际上是一个很长的二进制数组+一系列随机hash算法映射函数,主要用于判断一个元素是否在集合中。通常我们会遇到很多要判断一个元素是否在某个集合中的业务场景,一般想到的是将集合中所有元素保存起来,然后通过比较确定。链表、树、散列表(又叫哈希表,Hash table)等等数据结构都是这种思路,但是随着集原创 2022-04-10 14:43:01 · 691 阅读 · 0 评论 -
redis系列(一)
1、Redis为什么选择单线程?这种问法其实并不严谨,为啥这么说呢?Redis的版本很多3.x、4.x、6.x,版本不同架构也是不同的,不限定版本问是否单线程也不太严谨。版本3.x ,最早版本,也就是大家口口相传的redis是单线程,阳哥2016年讲解的redis就是3.X的版本。版本4.x,严格意义来说也不是单线程,而是负责处理客户端请求的线程是单线程,但是开始加了点多线程的东西(异步删除)。最新版本的6.0.x后,告别了大家印象中的单线程,用一种全新的多线程来解决问题。1.1、Redi原创 2022-04-09 16:06:32 · 937 阅读 · 0 评论 -
第三章、链表的面试题
1、单链表的面试题1.1、获取到单链表的节点的个数(如果是带头结点的链表,需求不统计头节点)?// 方法:获取到单链表的节点的个数(如果是带头结点的链表,需求不统计头节点)/** * * @param head 链表的头节点 * @return 返回的就是有效节点的个数 */public static int getLength(HeroNode head) { if (head.next == null) { // 空链表 return 0; } int length = 0;原创 2021-04-15 00:03:48 · 79 阅读 · 0 评论 -
第三章、链表
1、链表1.1、内存结构内存上来看:链表存储空间不连续(不像数组)逻辑上来看:链表属于线性结构1.2、特点链表是以节点的方式来存储,是链式存储data 域存放数据,next 域指向下一个节点链表分带头节点的链表和没有头节点的链表, 根据实际的需求来确定1.3、定义nodenode 实体no :英雄编号name :英雄名字nickName :英雄昵称next :指向下一个 HeroNode 节点//定义HeroNode , 每个HeroNode 对象就是一个节点cla转载 2021-04-15 00:01:03 · 86 阅读 · 0 评论 -
redis面试题,redis的内存淘汰策略以及手写LRU算法
面试题:生产上你们你们的redis内存设置多少?如何配置、修改redis的内存大小如果内存满了你怎么办?redis清理内存的方式?定期删除和惰性删除了解过吗redis缓存淘汰策略redis的LRU了解过吗?可否手写一个LRU算法1、查看Redis最大占用内存配置文件redis.conf的maxmemory参数,maxmemory是bytes字节类型,注意转换。命令获取,config get maxmemory2、redis默认内存多少可以用?如果不设置最大内存大小或者设置最大内原创 2021-04-11 12:11:36 · 393 阅读 · 0 评论