「面试」拿到B站的意向书

本文分享了一次B站服务端开发面试的经验,涉及操作系统(自旋锁)、Redis(淘汰策略)、MySQL(锁机制、B+树)和基本数据结构(跳表)等方面的知识。面试中讨论了各种锁的区别、IO模型、Redis的内存管理和MySQL的事务处理。同时,还探讨了如何解决缓存穿透和雪崩问题,以及数据结构在实际应用中的优化策略。
摘要由CSDN通过智能技术生成

此次B站服务端开发面试之旅可谓惊险,不过通过对大部分面试题套路的掌握,不出意外还是拿下了,下面我们来看看这些骚题是不是常见的不能再常见的了。这些面试题看了就能面上?当然不是,只是通过这些题让自己知道所欠缺的是什么,以及可以去看看哪些资料。

1 操作系统相关

  • 自旋锁和一般锁的区别是什么?为什么要使用自旋锁?

当一个线程在获取锁的时候,如果这个锁已经被其他线程获取,那么这个线程不会破门而入,而是循环等待,但是嗷嗷待哺,需要不断地嗷嗷叫判断锁是否被成功获取,直到获取到锁才会退出循环。

自旋锁通常会出现哪些问题?

如果某个线程拿着锁死不放手,其他线程没法拿到这把锁,只好等待获取锁的线程进入循环等待的状态,等待不是睡觉,还是会消耗CPU,等待久了就会导致CPU的使用率太高。

那么自旋锁和其他锁到底有啥不同?

从线程状态来看,自旋锁的状态是运行-运行-运行。而非自旋锁的状态是运行—阻塞—运行,所以自旋锁会更高效。

不管是什么锁,都是为了实现保护共享资源而提出的一种锁机制,都是为了对某项资源的互斥使用。对于互斥锁而言,如果资源已经被占用,那么资源的申请者只会进入睡眠的状态。而自旋锁不会引起调用者睡眠,而是一直循环在那里查看该自旋锁的保持着是否已经释放了锁。

那么在Java中如何去实现一个自旋锁

public class SpinLock {
   
    private AtomicReference<Thread> cas = new AtomicReference<Thread>();
    public void lock() {
   
        Thread current = Thread.currentThread();
        // 利用CAS
        while (!cas.compareAndSet(null, current)) {
   
            // DO 
        }
    }
    public void unlock() {
   
  • 522
    点赞
  • 2896
    收藏
    觉得还不错? 一键收藏
  • 105
    评论
评论 105
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值