美文网首页程序员专栏
一道非常简单的Java面试题

一道非常简单的Java面试题

作者: 享学课堂 | 来源:发表于2020-07-09 21:20 被阅读0次

    今天跟大家谈一谈并发编程中,大厂面试官经常会问的一个最简单的问题:“非公平锁和公平锁有什么区别?

    看完第一眼,是不是很简单?

    很多人张口就回答:“随机访问”、“插队访问””。

    这么回答对不对?只能说,也没错。但如果我作为面试官,我最想听到的就是:非公平锁有两次抢锁机会,但是一旦进入队列,就永远排队。“一朝排队,永远排队。

    上面的结论,是我通过分析公平锁和非公平锁lock方法的源码之后得出来的。

    公平锁lock方法的源码分析

    final void lock() {          
         acquire(1);//1------标识加锁成功之后改变的值
      }
    

    非公平锁的lock方法

    finalvoid lock() {
          if (compareAndSetState(0, 1))
                 setExclusiveOwnerThread(Thread.currentThread());
          else
                   acquire(1);
      }
    

    公平锁、非公平锁代码执行逻辑的区别

    用一个例子来通俗讲解公平锁和非公平锁,那就是:

    1、你去火车站买车票,大家都老老实实排队,你也跟着排队,非常公平合理,这就是公平锁

    2、你去火车站买车票,大家都老老实实排队,但你是个小混混,直接走到售票窗口,“给我一张票!”

    结果1:大家都不敢吭声,售票员直接把票卖给你了;抢锁成功

    结果2:又来了一个小混混,把你按在地上一顿摩擦,他插队买票,你乖乖到后面排队;抢锁失败

    很多人认为非公平锁插队就是永远在插队,实际上只要它第一次加锁失败之后,一旦进入队列,跟公平锁就没有区别了。

    为什么阿里巴巴、美团经常会问你这些看起来很简单的面试题?因为这些看似简单的题目,面试官可以从你的回答里看出你的真实水平。****(文末有惊喜,笔者整理了阿里、美团等大厂的面试题,看看你能否答上来?)

    Java中有各种各样的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率!从互斥锁/读写锁、乐观锁/悲观锁、自旋锁、分段锁…再到JDK锁、分布式锁,你对Java中的锁了解多少?

    谷歌线上如何使用锁及各种锁的效率有何不同?

    主流分布式锁方案你知道哪些?

    如何实现Redis分布式锁?

    说在最后

    这里还有一份刚更新的《2020最新大厂面试题汇总》,>点击此处,免费领取以下资料

    相关文章

      网友评论

        本文标题:一道非常简单的Java面试题

        本文链接:https://www.haomeiwen.com/subject/mjfecktx.html