1. 程式人生 > >理解同步的PV操作

理解同步的PV操作

pv 操作 信號量 同步控制 數據區

PV操作是Edsger Dijkstra提出的一種經典的解決同步不同執行線程的問題的方法,這種方法是基於一種叫信號量的特殊變量來實現的。
技術分享圖片

 簡單理解為就是通過共享變量+信號量實現的一種同步機制,其應用與生產者消費者模型,讀寫問題等領域。
  在Java中有基於AQS實現的Semaphore信號量類。

 wiki對於其名字來源的解釋

技術分享圖片

https://en.wikipedia.org/wiki/Semaphore_(programming)#Operation_names

可以做出以下對比:
P(down/signal/release/pend/try to reduce)
V (up/wait/acquire/post/try to increase)

通俗的講,P操作對應加鎖,V操作對應解鎖。加鎖對應的是P將信號量減1,並阻塞其他線程,解鎖對應的是V將信號量加1,並喚醒某一個線程。
在Java的ReentrantLock類中,lock方法對應acquire(1)方法,unlock對應release(1),是否與上面定義不一致?不是的,在p操作加鎖中,對應release,其實是對於一個事物的兩種表達而已。對於p操作,進入共享區的線程可以理解為release信號量,但是給別的線程加鎖,lock。

下面畫圖理解:

技術分享圖片

三個線程同時訪問共享區,t1先進入,執行p操作,將信號量s從1置為0,此時t2,t3程在進入共享區的話,發現s=0,p操作會掛起t2,t3。當t1離開共享區的時候,執行v操作,將信號量s從0置為1,並且喚醒t2或者t3,然後t2又將信號量s從1置為0,重復上面動作,從而返回循環該pv操作。

可以看出,p操作阻塞其他線程,也就是加鎖。v操作喚醒其他線程。也就是解鎖。

技術分享圖片

理解同步的PV操作