小滴课堂后端面试题(16)~持续更新中

一、能否解释下什么是CAS,存在什么问题

回答

全称是Compare And Swap,即比较再交换,是实现并发应用到的一种技术 
底层通过Unsafe类实现原子性操作操作包含三个操作数 —— 内存地址(V)、预期原值(A)和新值(B)。 
如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 ,若果在第一轮循环中,a线 程获取地址里面的值被b线程修改了,那么a线程需要自旋,到下次循环才有可能机会执行。 

CAS这个是属于乐观锁,性能较悲观锁有很大的提高 
AtomicXXX 等原子类底层就是CAS实现,一定程度比synchonized好,因为后者是悲观锁
(一)CAS 会存在什么比较严重的问题?
1、自旋时间长 CPU 利用率增加, CAS 里面是一个循环判断的过程,如果线程一直没有获取到状态,cpu 资源会一直被占用
2、存在 ABA 问题

二、能否解释下什么是CAS里面的ABA问题,怎么避免这个问题呢?

回答

如果一个变量V初次读取是A值,并且在准备赋值的时候也是A值,那就能说明A值没有被修改过吗?其实是不能 的,因为变量V可能被其他线程改回A值,结果就是会导致CAS操作误认为从来没被修改过,从而赋值给V 

给变量加一个版本号即可,在比较的时候不仅要比较当前变量的值 还需要比较当前变量的版本号。 
在java5中,已经提供了AtomicStampedReference来解决问题,检查当前引用是否等于预期引用,其次检 查当前标志是否等于预期标志,如果都相等就会以原子的方式将引用和标志都设置为新值

三、能否解释下什么是进程、线程、协程,他们之间的关系是怎样的

回答

答案: 
进程: 本质上是一个独立执行的程序,进程是操作系统进行资源分配和调度的基本概念,操作系统进行资源分 配和调度的一个独立单位 

线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程 中可以并发多个线程,每条线程执行不同的任务,切换受系统控制。 

协程: 又称为微线程,是一种用户态的轻量级线程,协程不像线程和进程需要进行系统内核上的上下文切换, 协程的上下文切换是由用户自己决定的,有自己的上下文,所以说是轻量级的线程,也称之为用户级别的线程 就叫协程,一个线程可以多个协程,线程进程都是同步机制,而协程则是异步 
Java的原生语法中并没有实现协程,目前python、Lua和GO等语言支持 

关系:一个进程可以有多个线程,它允许计算机同时运行两个或多个程序。线程是进程的最小执行单位,CPU 的调度切换的是进程和线程,进程和线程多了之后调度会消耗大量的CPU,CPU上真正运行的是线程,线程可 以对应多个协程

 协程对于多线程有什么优缺点吗

优点:
非常快速的上下文切换,不用系统内核的上下文切换,减小开销 
单线程即可实现高并发,单核CPU可以支持上万的协程 
由于只有一个线程,也不存在同时写变量的冲突,在协程中控制共享资源不需要加锁 

缺点:
协程无法利用多核资源,本质也是个单线程 
协程需要和进程配合才能运行在多CPU上 
目前java没成熟的第三方库,存在风险 
调试debug存在难度,不利于发现问题

四、能否说下缓存击穿、穿透、雪崩的区别?

回答

(一)缓存击穿 (某个热点key缓存失效了)

1、缓存中没有但数据库中有的数据,假如是热点数据,那 key 在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB ,造成瞬时 DB 请求量大、压力增大。
2、和缓存雪崩的区别在于这里针对某一 key 缓存,后者则是很多 key
3、预防:设置热点数据不过期,定时任务定时更新缓存,或者设置互斥锁
(二)缓存穿透(查询不存在数据)
1、查询一个不存在的数据,由于缓存是不命中的,并且出于容错考虑,如发起为 id “-1” 不存在的数据
2、如果从存储层查不到数据则不写入缓存这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。存在大量查询不存在的数据,可能DB 就挂掉了,这也是黑客利用不存在的key 频繁攻击应用的一种方式。
3、预防:接口层增加校验,数据合理性校验,缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value 对写为 key-null ,设置短点的过期时间,防止同个 key 被一直攻击
(三)缓存雪崩 ( 多个热点 key 都过期 )
1、大量的 key 设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时 DB 请求量大、压力骤增,引起雪崩
2、预防:存数据的过期时间设置随机,防止同一时间大量数据过期现象发生,设置热点数据永远不过期,定时任务定时更新

五、创建索引的时候主要考虑啥,使用索引的优缺点有哪些,使用应该注意些什么

回答 

考虑点:结合实际的业务场景,在哪些字段上创建索引,创建什么类型的索引 

索引好处: 
快速定位到表的位置,减少服务器扫描的数据 
有些索引存储了实际的值,特定情况下只要使用索引就能完成查询 

索引缺点: 
索引会浪费磁盘空间,不要创建非必要的索引 
插入、更新、删除需要维护索引,带来额外的开销 
索引过多,修改表的时候重构索引性能差 

索引优化实践 
前缀索引,特别是TEXT和BLOG类型的字段,只检索前面几个字符,提高检索速度 
尽量使用数据量少的索引,索引值过长查询速度会受到影响 
选择合适的索引列顺序 
内容变动少,且查询频繁,可以建立多几个索引 
内容变动频繁,谨慎创建索引 
根据业务创建适合的索引类型,比如某个字段常用来做查询条件,则为这个字段建立索引提高查询速度 
组合索引选择业务查询最相关的字段
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值