理解同步的PV操作
阿新 • • 發佈:2018-06-02
pv 操作 信號量 同步控制 數據區 PV操作是Edsger Dijkstra提出的一種經典的解決同步不同執行線程的問題的方法,這種方法是基於一種叫信號量的特殊變量來實現的。
通俗的講,P操作對應加鎖,V操作對應解鎖。加鎖對應的是P將信號量減1,並阻塞其他線程,解鎖對應的是V將信號量加1,並喚醒某一個線程。
在Java的ReentrantLock類中,lock方法對應acquire(1)方法,unlock對應release(1),是否與上面定義不一致?不是的,在p操作加鎖中,對應release,其實是對於一個事物的兩種表達而已。對於p操作,進入共享區的線程可以理解為release信號量,但是給別的線程加鎖,lock。 可以看出,p操作阻塞其他線程,也就是加鎖。v操作喚醒其他線程。也就是解鎖。
簡單理解為就是通過共享變量+信號量實現的一種同步機制,其應用與生產者消費者模型,讀寫問題等領域。
在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)
在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操作。
理解同步的PV操作