java線程通信與協作小結 多線程中篇(十六)


 
在鎖與監視器中我們對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並發解決方案很小,但是卻很重要的一部分底層建築
借助於這部分底層建築或者這部分的核心理念,你可以構建出來更加高大上的並發工具
而且
在實際的項目中我們是不會直接創建線程的,也幾乎不使用原始的調度、協作方法的。
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM