大多數(shù)情況下,鎖的申請都是非公平的, 如果線程1與線程2都在請求鎖A,當鎖A可用時, 系統(tǒng)只是會從阻塞隊列中隨機的選擇一個線程, 不能保證其公平性。
公平的鎖會按照時間先后順序,保證先到先得, 公平鎖的這一特點不會出現(xiàn)線程饑餓現(xiàn)象。
synchronized內部鎖就是非公平的. ReentrantLock重入鎖提供了一個構造方法:ReentrantLock(boolean fair) ,當在創(chuàng)建鎖對象時實參傳遞true可以把該鎖設置為公平鎖. 公平鎖看起來很公平,但是要實現(xiàn)公平鎖必須要求系統(tǒng)維護一個有序隊列,公平鎖的實現(xiàn)成本較高,性能也低. 因此默認情況下鎖是非公平的. 不是特別的需求,一般不使用公平鎖。
package com.wkcto.lock.method;
import java.util.concurrent.locks.ReentrantLock;
/**
* 公平 鎖與非公平鎖
*/
public class Test01 {
// static ReentrantLock lock = new ReentrantLock(); //默認是非公平鎖
static ReentrantLock lock = new ReentrantLock(true); //定義公平鎖
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
while (true){
try {
lock.lock();
System.out.println(Thread.currentThread().getName() + " 獲得了鎖對象");
}finally {
lock.unlock();
}
}
}
};
for (int i = 0; i < 5; i++) {
new Thread(runnable).start();
}
/*
運行程序
1)如果是非公平鎖, 系統(tǒng)傾向于讓一個線程再次獲得已經(jīng)持有的鎖, 這種分配策略是高效的,非公平的
2)如果是公平鎖, 多個線程不會發(fā)生同一個線程連續(xù)多次獲得鎖的可能,保證了公平性
*/
}
}