Semaphore和Mutex比較

Mutex即互斥鎖。在北美的一些小辦公室,常常能見到很小的男女公用的洗手間,這種洗手間只有一把鑰匙,只有拿到了這個鑰匙的人才可以進入洗手間。用完洗手間後,此人將鑰匙釋放,等待隊列中的第一個人才可以獲取鑰匙進入洗手間。在這裏,鑰匙是mutex, 洗手間是不能被並行訪問的受保護資源,Mutex只能被獲取者釋放。在java中,一般用synchronized(某個對象鎖)來保證一段代碼不會被並行運行。如果一個方法加了synchronized關鍵字,那麼一個線程只有獲取了該對象的對象鎖才能執行這個方法,它等同於 fun() { synchronized(this) {...}} 

Semaphore則可以看成那種普通的洗手間。當洗手間滿了,其他人就只能在外面等待。semaphonre最常見的用途是生產者-消費者場景。例如一個消息隊列,經常會使用兩個信號量,一個信號量指示消息隊列是否滿了,另一個指示消息隊列是否空的。當多個producer往消息隊列中put消息,並指示empty信號量爲可用。一旦消息隊列滿了,full信號量能保證producer不再往隊列中Put消息。consumer則get消息,並指示full信號量可用。一旦隊列中不再有消息,empty信號量保證consumer不再get消息。信號量與Mutex最大的不同是,Mutex只能被acquire它的線程release, 可semaphore可以被不同的線程release

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章