在鎖與監視器中咱們對Object中的方法進行了簡單介紹
以監視器原理爲核心,三個方法:wait,notify、notifyAll,能夠完成線程之間的通訊
固然,不會像「語言」似的,有多種多樣的溝通語句
只有兩個關鍵詞:「等待」與「喚醒」
圍繞着同一個監視器的等待與喚醒,就能夠完成線程之間的協做
之因此這三個方法是Object中的,是由於在Java中,全部的Object都隱含一個內置的鎖和與之關聯的監視器
而對於線程自身的方法sleep、yield、join,則是線程的調度,是以線程爲中心的
某個線程休眠一下、某個線程「禮讓」一下其餘線程,等待某個線程結束,是一種主動式的管控
管控的核心仍舊是「等待」,可是與wait又有不一樣:
sleep是單純的等一下子,並不會釋放監視器;
yield是暫時的謙讓一下,也有可能會等一下子,也可能仍是會繼續執行(就好像咱們平時的「客氣」,你客氣一下說我來買單,並不必定真的能買單成功)
join底層依賴wait,內部經過同步以該線程對象爲鎖,進行等待,直到線程結束後得到通知(調用線程等待)
因此你看,以上的核心仍舊是「等待」與「喚醒」
由於線程通訊協做理論本質如此,並不像人與人之間的溝通那般多種多樣,線程之間就是那麼簡單幹脆,XXX你趕忙跟上,XXX你等一下,XXX你等YYY結束了你再弄...大抵如此
面對多線程引起的數據安全問題,大體分爲三類:原子性、可見性、有序性
Java從語言層面上提供synchronized以及volatile關鍵字進行保障
等待與喚醒的通訊方式也是基於同步的,因此wait、notify、notifyAll必須在同步中才可以使用
sleep雖然本質也是等待,可是原理不是監視器,是基於線程的因此sleep沒必要須在synchronized內,yield更不須要了,只是跟其餘線程客氣下,具體仍是要看CPU臉色
synchronized能夠對三大特性予以保障,從而能夠保障線程的安全,volatile是輕量級的線程同步工具,必定程度(某些場景)也能夠解決線程安全問題
因此能夠說,synchronized和volatile提供瞭解決線程安全問題的通常思路(那就是藉助於同步),而對於線程之間的同步則提供了「等待」與「喚醒」機制
同步是「框架」,等待與喚醒是框架內的手段,sleep、yield、join是對於線程的調度
因此,你看,對於多線程編程問題,藉助於關鍵字synchronized、volatile以及「等待」「喚醒」相關方法,在適當的時候也能夠對線程間進行單獨的調度,就可以很好地解決
可是多線程編程就這麼簡單麼?
固然不是,這只是Java多線程編程解決方案中的最爲核心的部分之一,是整個Java併發解決方案很小,可是卻很重要的一部分底層建築
藉助於這部分底層建築或者這部分的核心理念,你能夠構建出來更加高大上的併發工具
並且
在實際的項目中咱們是不會直接建立線程的,也幾乎不使用原始的調度、協做方法的。