java併發編程專題--再談等待與喚醒

線程的等待與喚醒有兩種方式:1、wait與notify;2、signal與await。兩種方式的主要區別在於是否對等待的條件進行分區。第1種方式沒有對不一樣等待條件的線程進行分區,這樣在某些狀況下就會下降效率,在"生產者消費者專題"中已經說過,第2種則解決了該問題。java

喚醒是無記憶的也就是說先喚醒後等待,等待的線程是不會被喚醒的。通常在等待時會有一個等待條件,可是一般在檢查等待條件時會使用while進行重複檢查,由於即便被喚醒了也有可能仍是知足等待條件的狀況(見生產者消費者專題),因此須要具體狀況具體分析,但爲了省事重複檢查是不會出錯的。編程

喚醒又包括喚醒一個和喚醒多個,這兩種狀況在某些狀況下區別很大(由於會死鎖!)當存在不一樣的等待條件確使用了相同的條件對象(synchronized和同一個condition並使用notify或者signal)就會發生(見生產者費者專題–談談優化一),這種狀況在java併發編程實戰中又叫信號劫持(意思就是把不應喚醒的喚醒了)。併發

相關文章
相關標籤/搜索