每日一面---真实面试题---12

先看原题,自己心里默想一遍答案再滑到后面对比答案。答案来源于网络,欢迎指正,共同进步

一、原题
  1. 自我介绍
  2. 问 项目
  3. Volatile 是干什么的?在内存层面上怎么实现的?使用场景是什么?
  4. synchronized 使用方法,底层是怎么实现的
  5. Java对 synchronized 有什么 改进? (偏向锁,轻量锁,重量锁)
  6. TCP 拥塞 算法
  7. Spring AOP 是干什么的? 使用场景? 底层实现?
  8. Mysql 引擎都有啥? 聚簇索引 和 非聚簇索引 是怎么实现的? B 树和 B+ 树有什么区别? 什么B + 树能让搜索变得更快?
  9. Mysql 事务隔离级别? 幻读是什么? 怎么才能解决幻读
  10. 知道Mysql 锁的粒度么? 什么是 GAP Lock (这个没答对)

------------------------------------------------------------------------优美的分割线------------------------------------------------------------------------
















二、答案
  1. 自我介绍

  2. 问 项目

  3. Volatile 是干什么的?在内存层面上怎么实现的?使用场景是什么?

    1、volatile是java提供的轻量级同步机制
    2、通过内存屏障来实现的
    3、并发编程中使用
    
  4. synchronized 使用方法,底层是怎么实现的

    类对象、实例对象、代码块
    
    jvm基于进入和退出Monitor对象来实现方法同步和代码块同步。
    方法级的同步是隐式,即无需通过字节码指令来控制的,它实现在方法调用和返回操作之中。JVM可以从方法常量池中的方法表结构(method_info Structure) 中的 ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法。当方法调用时,调用指令将会 检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先持有monitor(虚拟机规范中用的是管程一词), 然后再执行方法,最后再方法完成(无论是正常完成还是非正常完成)时释放monitor。
    代码块的同步是利用monitorenter和monitorexit这两个字节码指令。它们分别位于同步代码块的开始和结束位置。当jvm执行到monitorenter指令时,当前线程试图获取monitor对象的所有权,如果未加锁或者已经被当前线程所持有,就把锁的计数器+1;当执行monitorexit指令时,锁计数器-1;当锁计数器为0时,该锁就被释放了。如果获取monitor对象失败,该线程则会进入阻塞状态,直到其他线程释放锁。
    
  5. Java对 synchronized 有什么 改进?

    偏向锁,轻量锁,重量锁
    
  6. TCP 拥塞 算法

     TCP通过维护一个拥塞窗口来进行拥塞控制,拥塞控制的原则是,只要网络中没有出现拥塞,拥塞窗口的值就可以再增大一些,以便把更多的数据包发送出去,但只要网络出现拥塞,拥塞窗口的值就应该减小一些,以减少注入到网络中的数据包数。
    
    TCP拥塞控制算法发展的过程中出现了如下几种不同的思路:
    
    基于丢包的拥塞控制:将丢包视为出现拥塞,采取缓慢探测的方式,逐渐增大拥塞窗口,当出现丢包时,将拥塞窗口减小,如Reno、Cubic等。
    基于时延的拥塞控制:将时延增加视为出现拥塞,延时增加时增大拥塞窗口,延时减小时减小拥塞窗口,如Vegas、FastTCP等。
    基于链路容量的拥塞控制:实时测量网络带宽和时延,认为网络上报文总量大于带宽时延乘积时出现了拥塞,如BBR。
    基于学习的拥塞控制:没有特定的拥塞信号,而是借助评价函数,基于训练数据,使用机器学习的方法形成一个控制策略,如Remy。
    拥塞控制算法的核心是选择一个有效的策略来控制拥塞窗口的变化,下面介绍几种经典的拥塞控制算法。
    
  7. Spring AOP 是干什么的? 使用场景? 底层实现?

    AOP:
    	我们知道Java是一个面向对象(OOP)的语言,但它有一些弊端,比如当我们需要为多个不具有继承关系的对象引入一个公共行为,例如日志、权限验证、事务等功能时,只能在在每个对象里引用公共行为。这样做不便于维护,而且有大量重复代码。AOP的出现弥补了OOP的这点不足。
    
    使用场景:
    	Authentication 权限
    	Caching 缓存
    	Context passing 内容传递
    	Error handling 错误处理
    	Lazy loading 懒加载
    	Debugging  调试
    	logging, tracing, profiling and monitoring 记录跟踪 优化 校准
    	Performance optimization 性能优化
    	Persistence  持久化
    	Resource pooling 资源池
    	Synchronization 同步
    	Transactions 事务
    底层实现:
    	动态代理 + 反射
    
  8. Mysql 引擎都有啥? 聚簇索引 和 非聚簇索引 是怎么实现的? B 树和 B+ 树有什么区别? 什么B + 树能让搜索变得更快?

    
    
  9. Mysql 事务隔离级别? 幻读是什么? 怎么才能解决幻读

    按隔离水平高低排序,读未提交 < 读已提交 < 可重复度 < 串行化。
    
    幻读:
    	在一个事务内,同一条查询语句在不同时间段执行,得到不同的结果集。
    解决幻读:
    	解决幻读的办法是锁住记录之间的“间隙”,因此 MySQL InnoDB 引入了新的锁,叫间隙锁(Gap Lock),这块需要使用间隙锁来解决幻读。
    
  10. 知道Mysql 锁的粒度么? 什么是 GAP Lock

    1、锁的类型分为读锁和写锁,这个很好区分。可以这样认为:如果有增删改,就是写锁。如果是查询,就是读锁。
    2、锁的粒度也就是锁的范围,分为行锁和表锁。锁的范围和多个因素有关,包括事务隔离级别、是否使用索引。
    
    什么是 GAP Lock :
    	间隙锁(Gap Lock):锁定索引记录间隙,确保索引记录的间隙不变。间隙锁是针对事务隔离级别为可重复读或以上级别而已的。
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值