面试题
文章平均质量分 72
不想睡觉的橘子君
这个作者很懒,什么都没留下…
展开
-
Paxos算法、Raft算法、ZAB原子广播协议、gossip协议的描述与对比
1,paxos算法这里简单总结下,gossip协议是所有分布式共识算法(用于达成一致,也就是满足一致性)的祖宗,但是gossip协议比较复杂,它设想的是有多个节点都可以提出提案,也有多个节点都可以对提案进行投票。每个节点在发出提案时,都会有一个提案ID分配给该提案,其他节点收到提案后,会和自身记录的已接受过的上次的提案ID比较,如果这次的提案ID比上次提案更大,意味着是新的提案,对其进行投票;如果这次提案ID没上次大,意味着是旧的提案,不用管。原创 2024-11-05 14:54:16 · 871 阅读 · 0 评论 -
【Redis】一种常见的Redis分布式锁原理简述
上面实现的分布式锁,解决了如下几个问题不要重复设置锁→setnx被别的线程解锁怎么办→ThreadLocal和UUID只依靠setnx,持有锁的线程挂掉无法释放锁→给锁添加过期时间,expire命令设置过期时间setnx和expire不够原子→set命令和参数ex、nx,或者lua脚本配置命令eval、evalsha过期时间不好评定→加入看门狗守护线程,配合延迟队列,看门狗线程用死循环,使用take方法阻塞的等待将最近要续期的任务,将其续期。原创 2024-11-01 17:12:02 · 916 阅读 · 0 评论 -
【MySQL】可重复读级别下基于Next Key Lock解决幻读
昨天读到了一篇文章[1],里面讲,面试官说mysql的可重复读级别下有解决幻读的方式,最后公布了答案,是在sql后面加for update。这么说倒是没错,但是这种问法给我一种奇怪的感觉,因为for update无论在哪个隔离级别下,都能提供x锁进行锁定防止幻读,而next key lock,是x锁的三种实现算法之一,next key lock,也不应该翻译为间隙锁。下面我们一一讲来。原创 2024-10-31 15:30:33 · 843 阅读 · 0 评论 -
【多线程】线程状态与并发三大特性的细节剖析
这篇文章主要用于对于多线程的一些查缺补漏。原创 2024-08-03 11:19:30 · 728 阅读 · 0 评论 -
【架构】缓存与数据库:双写一致性、缓存问题
这里我讲的是缓存和数据库,以redis和mysql举例,实际上缓存包括不限于浏览器缓存、redis、memcache、本地缓存guava等等,数据库也有很多种,这里我们仅仅以较常见的redis和mysql举例。原创 2024-07-26 21:21:58 · 665 阅读 · 0 评论 -
【JVM】调优工具
这里简单介绍一下各种调优用到的工具。原创 2024-05-14 17:44:37 · 954 阅读 · 1 评论 -
【JVM】从可达性分析,到JVM垃圾回收算法,再到垃圾收集器
深入理解Java虚拟机》[1]中,有下面这么一段话:在JVM的各个区域中,如虚拟机栈中,栈帧随着方法的进入和退出而有条不紊的执行者出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行期会由即时编译器进行一些优化,但在基于概念模型的讨论里,大体上可以认为是编译器可知的),因此这几个区域的内存分配和回收都具有确定性,在这几个区域内就不需要考虑如何回收的问题,当方法结束或者线程结束时,内存自然就跟随着回收了。原创 2024-05-13 22:45:24 · 962 阅读 · 0 评论 -
【JVM】从硬件层面和应用层面的有序性和可见性,到Java的volatile和synchronized
Java的关键字volatile保证了有序性和可见性,这里我试着从底层开始讲一下有序性和可见性。原创 2024-05-03 17:41:21 · 958 阅读 · 0 评论 -
【JVM】class文件格式,JVM加载class文件流程,JVM运行时内存区域,对象分配内存流程
这篇文章本来只是想讲一下class文件格式,讲着讲着越讲越多。JVM这一块吧,知识比较散比较多,如果深研究下去如死扣《深入理解Java虚拟机》,这本书很深很细,全记住是不可能的,其实也没必要。趁这个机会直接把标题中的这些的主要知识点都总结一下,不会过深,也不会是太浮于表面的八股文,总结一下比较好记,也省的后面自己再忘了。原创 2024-05-02 16:05:18 · 1165 阅读 · 1 评论 -
【MySQL】双写、重做日志对宕机时脏页数据落盘的作用的疑问及浅析
首先,我先介绍或者说概括一下双写机制,和重做日志文件。在《MySQL技术内幕 InnoDB技术引擎》[1]一书中,双写机制部分介绍原文如下:如果说Insert Buffer带给InnoDB存储引擎的是性能上的提升,那么doublewrite(两次写)带给InnoDB存储引擎的是数据页的可靠性。当发生数据库宕机时,可能InnoDB存储引擎正在写入某个页到表中,而这个页只写了一部分,比如16kb的页,只写了前4kb,之后就发生了宕机,这种情况被成为部分写失效(partial page write)。原创 2024-01-29 23:30:49 · 1060 阅读 · 1 评论 -
【Mybatis】浅谈延迟加载
从上面的应用场景可以看出,延迟加载的使用场景为 不管是查询list还是查询list中每个entity的详情,都调用同一接口,也就是我们的延迟加载的接口。这个接口的xml可以通过Mybatis的延迟加载的特性,在查询list的时候避免多表联查提升性能,又可以在查询详情的时候多表联查查询具体详情。针对这样一种情况,延迟加载这一种机制就出现了,延迟加载(懒加载)顾名思义,就是对某种信息推迟加载,这样的技术也就帮助我们实现了 “按需查询” 的机制,在一对多,或者多对多的情况下[2]...原创 2022-08-03 15:27:35 · 399 阅读 · 0 评论 -
【面试题】从volatile到 指令重排 再到 happen before规则 最后到 java内存模型三大特性
volatile是Java的一个关键字,它并不是用Java实现的,因为涉及指令重排等更加底层的知识,比起源码更难理解其实现,所以笔者一路看下来,决定自己写一篇文章,总结一下,大致包括的知识点如标题所示,包括了volatile,指令重排,happen before规则,java内存模型三大特性。但是笔者会挑选一个尽量合适的顺序来讲下这些点。在讲volatile或者synchronized时,常会说到原子性、顺序行、可见性等特性,其实这三个特性指的就是指的Java内存模型的三大特性。内存模型而Java内存模型原创 2022-07-23 15:59:38 · 260 阅读 · 0 评论 -
【多线程】创建线程池有几种方式
经过源码的探究,可以看出,线程池的构造,可以使用newThreadPoolExecutor来直接构造一个自定义的线程池,或者Executors的方法来构造6种不同的线程池。Executors中的6种方法,其中有5种都是调用newThreadPoolExecutor来构造线程池,只有抢占式线程池WorkStealingPool是没有调用newThreadPoolExecutor来实现线程池。[1],面试官线程池有哪几种创建方式,能详细的说下么?httpshttpshttpshttps。......原创 2022-07-20 14:49:53 · 557 阅读 · 0 评论 -
【多线程】并行和并发的区别
并发,指的是同一时间多个进程争抢一个cpu资源。一个进程执行,另外的进程必然无法执行。并行和并发,都是在同一时间,有两个及以上的进程需要cpu资源时,发生的情况。并行,是每个进程都有一个cpu资源,同一时间多个进程同时执行。......原创 2022-07-15 09:49:13 · 184 阅读 · 0 评论 -
【面试题】在 Queue 中 poll()和 remove()有什么区别
简而言之,虽然两者都是找到Queue的头节点并返回,但是在队列为空(找不到头节点时的行为不一样),remove在找不到头节点时会返回一个NoSuchElementException异常。而poll则是返回一个null。原创 2022-07-14 17:47:56 · 290 阅读 · 0 评论 -
【源码】ArrayList 和 Vector 的区别是什么,及扩容倍数的区别
如文章[1]所说,ArrayList和Vector的区别在于,一,ArrayList线程不安全,Vector线程安全。二,ArrayList扩容是变为原来的1.5倍,而Vector是2倍。本文中要探究的就是扩容倍数这里的源码。ArrayList和Vector,调用add方法时,都会调用一个grow方法,来确保数组的容量够用。两者扩容倍数的不同,仅在于grow方法的实现有所不同。从图中可以看出,Vector扩容的代码为oldCapacity + oldCapacity ,也就是2倍的oldCapaci原创 2022-07-14 15:00:33 · 227 阅读 · 0 评论 -
【源码】HashSet的实现原理
前文已经讲过HashMap的部分实现原理[1],那么HashSet的实现原理是怎样的呢。首先看下HashSet的构造函数。可以清楚的看到HashSet的构造函数其实就是构造了一个HashMap,其初始容量和负载因子都是默认的16和0.75.在add时,方法实现如下:其中PRESENT可以看到,PRESENT是一个new出来的Object对象,它只是起一个辅助作用。其中puVal方法,会返回添加进来的value(PRESENT这个Object对象)或者是Null。而add方法中根据返回的是否是N原创 2022-07-14 10:51:29 · 147 阅读 · 0 评论 -
【源码】HashMap如何读取遇到哈希冲突的key的值
在遇到哈希冲突时,有以下几种方法可以采用:线性探测法(开放地址法)、链式寻址法(链式散列)、再hash、公共区域等方法[1]。在Java中,HashMap采用了链式散列,也就是链式寻址法。通常的说,就是数组+链表。数组的每个元素结构如下:当遇到哈希冲突[2]时,会将节点放在数组这个节点所代表的链表的最后。基本上网上的文章都在说Java的HashMap在遇到哈希冲突时是这么解决的哈希冲突,但是很少有说在get的时候,怎么判断的这个链表里哪个节点是这个key对应的节点。查看了源码以后,发现在get方法是这样原创 2022-07-14 00:00:02 · 1495 阅读 · 0 评论 -
QPS和TPS的区别
在讲到并发时,有两个经常用到的术语,QPS和TPS,经常搞混记不清,其实了解了他们的全称就好懂了。每秒查询率(Query Per Second, QPS)每秒处理事务数(Transactions Per Second, TPS)[1]个人理解,两者衡量的维度或者说侧重的方向不一样。每秒查询率QPS侧重的是系统面对的并发量是多大,而每秒处理事务数TPS是侧重本身的吞吐量,或者说每秒能完成多少完整的操作。注,一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。[2]参考文献:[1],QPS原创 2022-07-08 11:13:33 · 1186 阅读 · 0 评论 -
【面试题】什么是事务,什么是脏读、不可重复读、幻读,以及MySQL的几种事务隔离级别的应对方法
说起mysql,即使是初学者也知道,数据库在执行事务的时候,会遇到几种问题,如脏读、不可重复读,幻读,为了应对这几种问题,有了如下几种事务隔离级别,分别解决了什么什么问题等[1]。在讲这些问题的时候,有一个首要的问题需要明确,什么是事务。事务的定义如下:数据库中的事务是指对数据库执行一批操作,在同一个事务当中,这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功的情况。事务是一个原子操作。是一个最小执行单元。可以甶一个或多个SQL语句组成在同一个事务当中,所有的SQL语句都成功执行时,整 个事务成原创 2022-06-22 22:25:39 · 449 阅读 · 0 评论 -
【面试题】instancof和getClass()的区别
最近在了解《Effective Java》中提到的eques方法的限制时,有讲到igetClass()可以替代nstanceof来判断是否是同一个子类。于是了解了一下两者的区别。简单的说,它们的区别是,同样是判断子类和父类是否相等,子类 instanceof 父类 为true子类.getClass() == 父类.getClass() 为false.因为这一点简单的差别,在实现子类的equals()方法时,要多加注意...原创 2022-06-21 17:09:21 · 124 阅读 · 0 评论 -
Java基础面试题
以后将陆续将一些Java基础的面试题陆续更新到这篇文档中原创 2021-05-21 21:52:51 · 96 阅读 · 0 评论 -
Java的代码块定义和执行顺序
Java的代码块有普通代码块、静态代码块、同步代码块、构造代码块。静态代码块在类中使用static修饰,并使用"{}"括起来的代码片段,用于静态变量的初始化或对象创建前的环境初始化.1.格式public class CodeBlock { static{ System.out.println("静态代码块"); }}2.执行时机静态代码块在类被加载的时候就运行了,而且只运行一次,并且优先于各种代码块以及构造函数。如果一个类中有多个静态代码块,会按照书写顺序依次原创 2020-10-22 10:32:50 · 233 阅读 · 0 评论 -
equals()和==的区别
默认情况下,都是从Object 继承而来的 equals() 与 == 是完全等价的,比较都是对象的内存地址,但我们可以重写 equals(),使其按照我们需求的方式进行比较,如 String 类重写了 equals() ,使其比较的是字符的序列,而不是内存地址。欢迎各位批评指正。...原创 2020-10-22 10:22:35 · 94 阅读 · 0 评论 -
hashCode()和equals()的区别
在面试的时候,这是一道比较常见的面试题。现将平时记录在Word里的面试题Q&A导入博客里。hashCode()是生成对象的哈希码,由于只是通过简单的哈希函数生成哈希码,在小概率的情况下,是有可能不同对象生成相同哈希码的。而equals()方法则严格的多,考虑到了诸如自反性等原则保证如果equals()结果为true则必定为相同对象,但是这种算法由于复杂,速度就会慢。所以在比较一个对象时,常常先用hashCode()比较一遍,如果为false,则必定不是同一个对象。然后再交由equals()判断。原创 2020-10-22 10:19:45 · 121 阅读 · 0 评论 -
简述sleep()和wait()的区别
sleep()方法和wait(0方法存在很多区别,简述一两点很简单,但是要全部讲好要好好记一下才行的。下面简述一下两个方法的主要区别。1.sleep()方法是在休眠指定的时间后会重新进入可运行状态(Runnable),wait()方法是会进入阻塞状态,需要通过代码如notify(),notifyAll()来将其唤醒才能重新进入可运行状态(Runnable)2.sleep()方法在休眠时不会放开对象的互斥锁,而wait()方法在阻塞时会放开互斥锁3.sleep()方法来自Thread类,wait()方法原创 2020-10-22 10:11:49 · 681 阅读 · 0 评论