cpu在排程執行緒的時候,會在等待佇列裡隨機挑選乙個執行緒。由於隨機性,故不能保證執行緒先到先得(synchronized控制的鎖就是這種非公平鎖)。這樣就會產生飢餓現象,即有些優先順序較低的執行緒可能永遠無法取得cpu的執行權,優先順序較高的執行緒會不斷搶占資源。於是,就有了公平鎖。
公平鎖可以保證執行緒按照時間順序執行,避免飢餓現象的產生。但是公平鎖的效率很低,因為要保證順序執行,就得維護乙個有序佇列。
reentrantlock便是公平鎖,通過在構造方法中傳入true就是公平鎖,傳入false就是非公平鎖。當然,預設false
public
reentrantlock
(boolean fair)
使用公平鎖實現效果:
public
class
lockfairtest
implements
runnable
finally}}
public
static
void
main
(string [
]args)
}
結果應該顯而易見了,兩個執行緒交替執行。 Java併發面試問題之公平鎖與非公平鎖
非公平鎖 注意一點,此時執行緒2可還停留在等待佇列裡啊,還沒開始嘗試重新加鎖呢!然而,不幸的事情發生了,這時半路殺出個程咬金,來了乙個執行緒3!執行緒3突然嘗試對reentrantlock發起加鎖操作,此時會發生什麼事情?很簡單!執行緒2還沒來得及重新嘗試加鎖呢。也就是說,還沒來得及嘗試重新執行ca...
java重入鎖 公平鎖和非公平鎖
鎖的重入是指同乙個執行緒可以多次獲取同乙個鎖,synchronize是隱式的可重入鎖,reentrantlock通過 實現了鎖的重入 final boolean nofairtryacquire int acquires else if current getexclusiveownerthread...
java並發包中的公平鎖與非公平鎖有啥區別
注意一點,此時執行緒2可還停留在等待佇列裡啊,還沒開始嘗試重新加鎖呢!然而,不幸的事情發生了,這時半路殺出個程咬金,來了乙個執行緒3!執行緒3突然嘗試對reentrantlock發起加鎖操作,此時會發生什麼事情?很簡單!執行緒2還沒來得及重新嘗試加鎖呢。也就是說,還沒來得及嘗試重新執行cas操作將s...