關(guān)于非公平鎖的詳細(xì)介紹可以參考之前的博客,有詳細(xì)的源碼分析:Lock非公平鎖源碼解讀
為什么說(shuō)非公平鎖效率高于公平鎖搞糕,我們先看源碼
公平鎖lock
final void lock() {
acquire(1);
}
/**
* Fair version of tryAcquire. Don't grant access unless
* recursive call or no waiters or is first.
*/
protected final boolean tryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
// 區(qū)別點(diǎn):判斷隊(duì)列中是否有線程在等待
if (!hasQueuedPredecessors() &&
compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0)
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
非公平鎖lock
final void lock() {
// 一上來(lái)就嘗試獲取鎖,減少進(jìn)入等待隊(duì)列些椒,減少park舵鳞,減少用戶態(tài)和內(nèi)核態(tài)的切換怀挠,從而提高性能埃唯。
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
非公平鎖區(qū)公平鎖的區(qū)別是什么撩匕??
- 非公平鎖筑凫,不講武德滑沧,一上來(lái)就“干”,不管有沒(méi)有人排隊(duì)巍实,一上來(lái)就嘗試獲取鎖滓技。
- 公平鎖,先看隊(duì)列中有沒(méi)有其他線程在排隊(duì)棚潦,同時(shí)也意味著令漂,線程park可能性更多,更浪費(fèi)性能丸边。
- 非公平鎖缺點(diǎn)叠必,有可能一個(gè)線程長(zhǎng)期獲取不到鎖,部分場(chǎng)景不適用妹窖,比如公平搶票場(chǎng)景纬朝。
why?骄呼?共苛?為什么說(shuō)非公平鎖性能高于公平鎖
簡(jiǎn)單講判没,就是因?yàn)榉枪芥i不講武德這種方式,減少了park隅茎,減少了用戶態(tài)和內(nèi)核態(tài)的切換澄峰,從而提高性能。