很重要的概念。
多線程通路同一段代碼,不會産生不确定的結果。則可以說這段代碼是線程安全的。
調用sleep()的時候,鎖并沒有被釋放,調用yield()也屬于這種情況;而wait()方法會将鎖釋放。
隻能在同步控制方法或同步控制塊裡面調用 wait()、notify()、notifyall()。如果在非同步控制塊中調用這些方法,能通過編譯但運作會出錯,得到illegalmonitorstateexception異常。
當調用某個executorservice的shutdownnow()時,它會調用 所有 由它控制的 線程的interrupt()。
thread.yield()告訴java線程排程器“重要的部分我已經完成,此刻可以将我挂起,切換給其他線程執行”。這個函數可用可不用,但用了它更容易按照自己的掌控去切換線程,進而驗證一些東西。
調用wait()時,執行兩個動作:挂起線程,釋放鎖。
别的地方調用notifyall(),将喚醒wait()所挂起的線程。線上程繼續運作之前将重新獲得上次wait()調用時釋放的鎖。
使用notify()時,在衆多等待同一個鎖的任務中隻有一個會被喚醒。
notifyall()喚醒所有等待同一個鎖的任務。注意,這并不意味着在程式的任何地方,任何被wait()挂起的線程都會被喚醒,。當notifyall()因為某個特定鎖而被調用時,隻有等待這個鎖的任務才會被喚醒。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SZslWbz9CX0xWdhZWZk9CX09Wbl9lcvRXakVGa49CXy9GdpRWZoh3LcRXZu5ibkN3Yuc2bsJmLjlGdhR3cvw1LcpDc0RHaiojIsJye.gif)
打蠟、抛光在多個線程中交替進行。
需要一個狀态切換的标志位,兩對wait()、notify()操作。
一:thinking in java 的例子
調試時可以看到有三個線程,很直覺。
二:自己改造,wait() notify()全放在car類中處理