P說 顯示鎖 ReentrantLock

2021-10-06 05:02:02 字數 2412 閱讀 6774

當執行緒a拿到sync鎖以後,執行緒b只能一直等待,知道執行緒a使用完並釋放鎖。

當我們進行讀寫操作時,讀操作和讀操作之間實際上是不會有衝突的,如果採用synchronized關鍵字實現同步的話,就會導致當多個執行緒都只是進行讀操作時,也只有乙個執行緒在可以進行讀操作,其他執行緒只能等待鎖的釋放而無法進行讀操作。

無法嘗試的去獲得鎖。

可以說,lock的出現就是為了解決synchronize的缺陷,實際上,synchronized在經過一段時間的優化之後,效率已經非常高了,如果沒有出現以下情況,是不需要使用lock的,直接使用synchronized關鍵字就行。

獲取鎖可以被中斷

超時獲取鎖

嘗試獲取鎖

讀多寫少的讀寫鎖

public

inte***ce

lock

reentrantlock是lock介面的代表性實現類,是乙個可重入鎖(鎖可以被多次獲得)。

public

class

lock

catch

(interruptedexception e)

finally}}

static

class

thread2

extends

thread

catch

(interruptedexception e)

finally}}

public

static

void

main

(string[

] args)

throws interruptedexception

}

reentrantlock 有兩個建構函式,有乙個可以傳入乙個布林型別的值,true為生成乙個公平鎖,false表示生成乙個非公平鎖。

/**

* creates an instance of .

* this is equivalent to using .

*/public

reentrantlock()

/** * creates an instance of with the

* given fairness policy.

* * @param fair if this lock should use a fair ordering policy

*/public

reentrantlock

(boolean fair)

每個執行緒都按照申請鎖時候的佇列順序依次取得鎖,第乙個申請鎖的人總是第乙個獲取鎖。

多個執行緒去獲取鎖的時候,會直接去嘗試獲取,獲取不到,再去進入等待佇列,如果能獲取到,就直接獲取到鎖。

公平鎖

優點:所有執行緒都可以被保證可以獲取到鎖。

缺點:吞吐量會下降,因為執行緒從掛起狀態到被喚醒是需要消耗一定時間的,在這段時間裡,公平鎖無法進行任何操作。

非公平鎖

優點:提高吞吐量,因為從執行緒掛起到喚醒這段時間,假設有其他執行緒已經可以獲取鎖就會直接獲取,減少了等待時間。

缺點:可能導致佇列中間的執行緒一直獲取不到鎖或者長時間獲取不到鎖,導致餓死。這種情況出現,是因為假設執行緒從掛起狀態到被喚醒,發現已經有執行緒捷足先登了,就又會被掛起,之後又被喚醒,又發現被人捷足先登,就又掛起。。。一直在迴圈這個過程。

可以通過reentrantlock 的newcondition()方法獲得condition物件,condition物件的功能與wait(),notify(),notifyall()一樣。

public

class

lock

catch

(interruptedexception e)

finally

system.out.

println

("執行緒a被喚醒..........");

}}static

class

thread2

extends

thread

finally}}

public

static

void

main

(string[

] args)

throws interruptedexception

}

reetrantreadwritelock是乙個讀寫鎖,適用於讀多寫少的情景,執行多個執行緒同時獲取讀鎖,但是只能有乙個執行緒獲取寫鎖,寫鎖被獲取時,其他執行緒獲取讀鎖或者寫鎖時都會被阻塞。

P說 併發與並行

並行是指同一時間可以執行的執行緒數量,注意這裡強調的是同時,假如有一塊八核的cpu,那麼它的並行數為8,因為它同時可以跑八個執行緒。與並行不同,併發強調的是單位時間內,也就是一段時間內跑了多少個執行緒,同樣假設有一塊八核的cpu,同時乙個執行緒需要20ms跑完,那麼100ms內的併發數就為 8 cp...

說一下偏向鎖 輕量級鎖 重量級鎖?

1.這三種鎖是指鎖狀態,並且是針對synchronized,這三種鎖的狀態是通過物件監視器在物件頭中的字段來表明的.2.偏向鎖是指一段同步 一直被乙個執行緒所訪問,那麼該執行緒會自動獲取鎖,降低鎖的代價.3.輕量級鎖是指當鎖是偏向鎖的時候,被另乙個執行緒所訪問,偏向鎖就會公升級為輕量級鎖,其他執行緒...

JAVA多執行緒顯示鎖和內建鎖

一 內建鎖 synchronized 1 內建鎖的獲得鎖和釋放鎖是隱式的,進入synchrnozied修飾的 要獲得鎖,走出相應的 要釋放鎖。2 與synchronized配套使用的執行緒通訊方式 wait notify notifyall wait會立刻釋放當前鎖,並進入等待狀態,等待的到相應的n...