随笔分类 -  常见面试题

摘要:说说你对程序计数器的理解 作用 PC寄存器用来存储指向下一条命令的地址,也是即将执行的指令代码。由执行引擎读取下一条指令。 为什么要有PC寄存器 因为CPU需要不停的切换各个线程,这时候切换回来,就知道接着从哪开始继续执行。 为什么PC寄存器要设定线程私有 因为在CPU来回切换的时候,为了确保准确记 阅读全文
posted @ 2020-12-23 23:57 天宇轩-王 阅读(226) 评论(0) 推荐(0)
摘要:深入解析synchronized 1 常见的几个并发问题 1.可见性问题 案例演示:一个线程根据boolean类型的标记flag, while循环,另一个线程改变这个flag变量的值,另一个线程并不会停止循环。 /** * @author WGR * @create 2020/12/22 -- 20 阅读全文
posted @ 2020-12-23 13:43 天宇轩-王 阅读(608) 评论(1) 推荐(0)
摘要:创建线程的四种方式: 继承Thread类,并复写run方法,创建该类对象,调用start方法开启线程。此方式没有返回值。 // 创建线程对象 Thread t = new Thread() { public void run() { // 要执行的任务 } }; // 启动线程 t.start() 阅读全文
posted @ 2020-12-21 16:29 天宇轩-王 阅读(271) 评论(0) 推荐(0)
摘要:原子性:undo log 事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部失败回滚。 undo log记录了回滚操作的日志,如果要撤销,按照undo log的回滚日志执行一遍就可以了(保证了原子性) 持久性:redo log 指一个事务一旦提交,它对数据库 阅读全文
posted @ 2020-12-21 00:39 天宇轩-王 阅读(159) 评论(0) 推荐(1)
摘要:在RR级别下,快照读是通过MVVC(多版本控制)和undo log来实现的,当前读是通过加record lock(记录锁)和gap lock(间隙锁)来实现的。在mysql中通过MVCC快照读和next-key(当前读)两种模式解决幻读问题。 关于MVVC MySQL InnoDB存储引擎,实现的是 阅读全文
posted @ 2020-12-21 00:31 天宇轩-王 阅读(361) 评论(0) 推荐(0)
摘要:InnoDB 行锁 行锁介绍 行锁特点 :偏向InnoDB 存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 InnoDB 与 MyISAM 的最大不同有两点:一是支持事务;二是 采用了行级锁。 InnoDB 的行锁模式 InnoDB 实现了以下两种类型的行锁 阅读全文
posted @ 2020-12-21 00:08 天宇轩-王 阅读(186) 评论(0) 推荐(0)
摘要:1). 全值匹配 ,对索引中所有列都指定具体值。 改情况下,索引生效,执行效率高。 explain select * from tb_seller where name='小米科技' and status='1' and address='北京市'\G; 2). 最左前缀法则 如果索引了多列,要遵守 阅读全文
posted @ 2020-12-20 22:23 天宇轩-王 阅读(407) 评论(0) 推荐(0)
摘要:InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务; InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败; Inno 阅读全文
posted @ 2020-12-20 21:11 天宇轩-王 阅读(861) 评论(0) 推荐(0)
摘要:Mybatis 是怎么支持延迟加载 答:Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载,association 指的就是一对一,collection 指的就是一对多查询。在 Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoad 阅读全文
posted @ 2020-12-20 20:57 天宇轩-王 阅读(139) 评论(0) 推荐(0)
摘要:Tomcat为什么要重写类加载器 出现的原因 无法实现隔离性:如果使用默认的类加载器机制,那么是无法加载两个相同类库的不同版本的,默认的累加器是不管你是什么版本的,只在乎你的全限定类名,并且只有一份。 **无法实现热替换:**jsp 文件其实也就是class文件,那么如果修改了,但类名还是一样,类加 阅读全文
posted @ 2020-12-20 14:18 天宇轩-王 阅读(365) 评论(0) 推荐(0)
摘要:JMM本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量的访问方式。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。 JMM关于同步的规定 线程解锁前,必须把共享变量的值刷新回主内存 线程加锁前,必须读取主内存的最新值到自己的工作内存 加锁解锁是同 阅读全文
posted @ 2020-12-19 23:22 天宇轩-王 阅读(830) 评论(0) 推荐(1)
摘要:怎么保证MQ的高可用 RocketMQ 采用的双主双从同步写的方法。 每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功,这种模式的优缺点如下: 优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与 阅读全文
posted @ 2020-12-19 19:52 天宇轩-王 阅读(205) 评论(0) 推荐(0)
摘要:怎么保证消息的不丢失 原因 消息生产者没有成功发送到MQ Broker 消息发送给MQ Broker后,Broker 宕机后导致内存中的消息数据丢失 消费者获取到消息,但消费者还没有来得及处理宕机了,但此时MQ中的消息已经删除,消费者重启后不能再消费之前的消息 解决思路 消息发送者发送给MQ Bro 阅读全文
posted @ 2020-12-19 17:51 天宇轩-王 阅读(148) 评论(0) 推荐(0)
摘要:怎么保证消息的幂等性 出现非幂等性的情况 1、生产者已把消息发送到mq,在mq给生产者返回确认消息的时候网络中断,故生产者未收到确定信息,生产者认为消息未发送成功,但实际情况是,mq已成功接收到了消息,在网络重连后,生产者会重新发送刚才的消息,造成mq接收了重复的消息 2、消费者在消费mq中的消息时 阅读全文
posted @ 2020-12-19 17:00 天宇轩-王 阅读(217) 评论(0) 推荐(0)
摘要:MQ怎么解决消息堆积的问题 网上普通回答 修复consumer的问题,确保其恢复消费速度,然后将现有consumer都停止 临时建立好原先10倍或者20倍的queue数量 然后写一个临时的分发数据的consumer程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立 阅读全文
posted @ 2020-12-19 16:34 天宇轩-王 阅读(1116) 评论(0) 推荐(0)
摘要:怎么解决Mysql的超大分页 用id优化 先找到上次分页的最大ID,然后利用id上的索引来查询,类似于select * from user where id>1000000 limit 100. 这样的效率非常快,因为主键上是有索引的,但是这样有个缺点,就是ID必须是连续的,并且查询不能有where 阅读全文
posted @ 2020-12-18 21:20 天宇轩-王 阅读(353) 评论(0) 推荐(0)
摘要:说明 1.在第二步的时候用的是建造者模式,其中BaseBuilder抽象类就扮演建造者接口的角色,得到一个XmlConfigBuilder对象。主要用来解析maybatis-config.xml,是主要的人口,先在配置文件中查找configuration节点,然后开始解析各个子节点,这些信息都会保存 阅读全文
posted @ 2020-12-18 15:02 天宇轩-王 阅读(94) 评论(0) 推荐(0)
摘要:MySQL目前主要有以下几种索引类型: 普通索引 普通索引是 MySQL 中最基本的索引类型,它没有任何限制,唯一任务就是加快系统对数据的访问速度。允许重复值和空值。 唯一索引 唯一索引列的值必须唯一,允许有空值。 主键索引 主键索引是一种特殊的唯一索引,不允许值重复或者值为空。 组合索引 指多个字 阅读全文
posted @ 2020-12-17 23:49 天宇轩-王 阅读(116) 评论(0) 推荐(0)
摘要:btree索引和hash索引的区别 Hash 索引 优点:Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。 缺点: Hash 索引仅仅 阅读全文
posted @ 2020-12-17 23:28 天宇轩-王 阅读(207) 评论(0) 推荐(0)
摘要:说说逃逸分析和栈上分配 逃逸分析: 它是可以有效减少java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。它能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。 当一个对象在方法中被定义后,对象只在方法内部使用,则认为没有发生逃逸。 当一个对象在方法中被定义后,它被 阅读全文
posted @ 2020-12-17 13:39 天宇轩-王 阅读(221) 评论(0) 推荐(0)