今天跟大家谈一谈并发编程中,大厂面试官经常会问的一个最简单的问题:“非公平锁和公平锁有什么区别?”
看完第一眼,是不是很简单?
很多人张口就回答:“随机访问”、“插队访问””。
这么回答对不对?只能说,也没错。但如果我作为面试官,我最想听到的就是:非公平锁有两次抢锁机会,但是一旦进入队列,就永远排队。“一朝排队,永远排队。”
上面的结论,是我通过分析公平锁和非公平锁lock方法的源码之后得出来的。
公平锁lock方法的源码分析
final void lock() {
acquire(1);//1------标识加锁成功之后改变的值
}
非公平锁的lock方法
finalvoid lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
公平锁、非公平锁代码执行逻辑的区别
用一个例子来通俗讲解公平锁和非公平锁,那就是:
1、你去火车站买车票,大家都老老实实排队,你也跟着排队,非常公