一個作業七年的小伙伴,竟然不知道”wait”和“notify”為什么要在Synchronized代碼塊里面,
好吧,如果螢屏前的你也不知道,請在評論區打上”不知道“,
對于這個問題,我們來看看普通人和高手的回答,
普通人:
額,,,,,,,,,,,,
高手:
-
wait和notify用來實作多執行緒之間的協調,wait表示讓執行緒進入到阻塞狀態,notify表示讓阻塞的執行緒喚醒,
-
wait和notify必然是成對出現的,如果一個執行緒被wait()方法阻塞,那么必然需要另外一個執行緒通過notify()方法來喚醒這個被阻塞的執行緒,從而實作多執行緒之間的通信,
-
在多執行緒里面,要實作多個執行緒之間的通信,除了管道流以外,只能通過共享變數的方法來實作,也就是執行緒t1修改共享變數s,執行緒t2獲取修改后的共享變數s,從而完成資料通信,

但是多執行緒本身具有并行執行的特性,也就是在同一時刻,多個執行緒可以同時執行,在這種情況下,執行緒t2在訪問共享變數s之前,必須要知道執行緒t1已經修改過了共享變數s,否則就需要等待,
同時,執行緒t1修改過了共享變數S之后,還需要通知在等待中的執行緒t2,
所以要在這種特性下要去實作執行緒之間的通信,就必須要有一個競爭條件控制執行緒在什么條件下等待,什么條件下喚醒,
-
而Synchronized同步關鍵字就可以實作這樣一個互斥條件,也就是在通過共享變數來實作多個執行緒通信的場景里面,參與通信的執行緒必須要競爭到這個共享變數的鎖資源,才有資格對共享變數做修改,修改完成后就釋放鎖,那么其他的執行緒就可以再次來競爭同一個共享變數的鎖來獲取修改后的資料,從而完成執行緒之前的通信,
-
所以這也是為什么wait/notify需要放在Synchronized同步代碼塊中的原因,有了Synchronized同步鎖,就可以實作對多個通信執行緒之間的互斥,實作條件等待和條件喚醒,
-
另外,為了避免wait/notify的錯誤使用,jdk強制要求把wait/notify寫在同步代碼塊里面,否則會拋出IllegalMonitorStateException
-
最后,基于wait/notify的特性,非常適合實作生產者消費者的模型,比如說用wait/notify來實作連接池就緒前的等待與就緒后的喚醒,
以上就是我對wait/notify這個問題的理解,
總結
這個是一個典型的經典面試題,
其實考察的就是Synchronized、wait/notify的設計原理和實作原理,
由于wait/notify在業務開發整幾乎不怎么用到,所以大部分人回答不出來,
其實并發這塊內容理論上來說所有程式員都應該要懂,不管是它的應用價值,還是設計理念,非常值得學習和借鑒,
本期的普通人VS高手面試系列就到這里結束了,喜歡的朋友記得點贊和收藏,
另外,有任何技術上的問題,職業發展有關的問題,都可以私信我,我會在第一時間回復,
著作權宣告:本博客所有文章除特別宣告外,均采用 CC BY-NC-SA 4.0 許可協議,轉載請注明來自
Mic帶你學架構!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力,歡迎關注「跟著Mic學架構」公眾號公眾號獲取更多技術干貨!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/469808.html
標籤:其他
下一篇:完了,我的小網站圖片掛了!
