【面试高频知识点】
第一批面试已经正式开始啦!快抓紧时间投递吧!
内推传送门:https://campus.ctrip.com/recommendation-apply/trip/38951?recommendCode=AH5dn&codeType=1&hash=%23%2Fjobs
面试现场👇👇
Java 基础
已经有很多小伙伴进入了专业面试阶段,还没有投递的学弟学妹们抓紧时间哦,尽早投递越早安排面试哦!!
高频知识点
公平锁与非公平锁
- 公平锁:各个线程申请资源时,会进入等待队列进行排队,当资源可以访问时由等待队列中第一个线程进行访问,属于有顺序的访问
- 优点:所有线程都可以获得资源,不会被饿死
- 缺点:唤醒需要消耗性能,吞吐量低,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。(A完成时会去唤醒B,此时C来了,还是要去排队即阻塞)
- 非公平锁:多个线程直接去尝试获取锁,如果没有申请到就进入等待队列,当资源空余时进行随机抢占,如此可以使得后来的线程也有可以得到资源
- 优点:可以减少CPU唤醒线程的开销,整体效率高(A完成时会去唤醒B,此时C来了直接获取锁,B唤醒后发现已经有锁了,继续阻塞,提高了利用率,有可能C只要获取了该资源就能够执行完,这样效率高,如果公平锁,还要一直排队,太死板,说不定排队首的还要等下一个资源,排队尾的就差这个资源)
- 缺点:有可能发生死锁,即某个线程一直得不到资源。导致饿死
- 公平锁:各个线程申请资源时,会进入等待队列进行排队,当资源可以访问时由等待队列中第一个线程进行访问,属于有顺序的访问
乐观锁和非乐观锁
- 乐观锁:总是以乐观的态度去判断,认为资源不会被其他线程占用,当需要更新时,会才有 CAS 看一下有没有被修改过,没有被动过就可以更新,适用多读的情况
- 悲观锁:总是认为资源会被抢占,在访问前先给资源上锁,此时其他线程不能抢占,等到访问结束释放锁后,其他线程才能继续访问该资源
CAS:比较并替换,比如读取一个数据,准备更新前会比较一下该数据与自己之前读的一样不一样,如果期间数据都一样即没有人修改过,则更新
volatile 关键字,修饰变量 state,管理状态
CAS + volatile ,实现高并发抢占