前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个最简单的面试题

一个最简单的面试题

作者头像
芋道源码
发布2020-07-09 15:52:20
4710
发布2020-07-09 15:52:20
举报
文章被收录于专栏:芋道源码1024芋道源码1024

作者:子路

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

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

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

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

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

公平锁lock方法的源码分析

代码语言:javascript
复制
final void lock() {
    acquire(1);//1------标识加锁成功之后改变的值
}

非公平锁的lock方法

代码语言:javascript
复制
finalvoid lock() {
    if (compareAndSetState(0, 1))
       setExclusiveOwnerThread(Thread.currentThread());
    else
        acquire(1);
}

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

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

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

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

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

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

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 芋道源码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档