「白話」可見性,原子性,有序性!Java並發必備知識幾分鐘就記住

當你點開這篇文章,你可能會有點失望,因為這邊文章用詞不太官方,與在書上看到的東西不太一致。在這篇文章中的用詞都會很“白話”,因為這些都是小編理解的總結,小編也會用最通俗的語言來介紹概念!

現在就開始介紹與Java併發相關的可見性,原子性,有序性!

“白話”可見性,原子性,有序性!Java併發必備知識幾分鐘就記住

如果沒有接觸過Java併發編程,可能很少會聽過這三個性質。但是,當你開始接觸併發編程後,理解了Java的內存模型,這三個性質就變得尤其重要!這裡如果對內存模型不是很瞭解,可以參考小編的另外一篇文章《 》,那麼今天小編就來介紹一下這三個性質的概念,這些概念可能和小夥伴們在書上看到的不同,但是,這一定是你最能看懂的概念了。

什麼是原子性

學過化學的小夥伴應該都知道原子,原子在化學中是一種不可再分的粒子,也就是說,在化學中,原子就是最小的單位了。

在Java中,我們所說的原子性就和化學中所說的原子一樣,都是一種不可再分的“粒子”。一個操作不能進行拆分,要麼執行,要麼不執行,這樣的操作就是原子性操作!

在Java中,有些原子性變量的操作直接由Java的內存模型來保證,我們熟悉的基本數據類型(long和double除外)的訪問、讀、寫操作都是原子性的。如果需要一些非原子性操作具備原子性,就需要程序員自行來控制了,可以利用lock/unlock、synchronized來保證原子性。

“白話”可見性,原子性,有序性!Java併發必備知識幾分鐘就記住

原子性就像化學的原子

什麼是可見性

可見性就更加通俗易懂了,就是變量的變化可以被看到!當一個線程修改了一個共享變量,其他線程立即可以知道這個修改,那麼這個共享變量就是具備可見性的。具有可見性的變量就像被裝上了一個大喇叭,只要發生改變,就進行廣播。

在Java中,通過將修改後的變量值同步到主內存,在變量讀取前從主內從刷新變量的方式實現可見性的。不僅僅是被volatile關鍵字修飾的變量是這樣實現可見性的,普通的變量也是一樣的操作,只不過被volatile關鍵字修飾後,變量的改變會立刻更新到主內存!關於volatile關鍵字的具體講解可參考《 》。除了volatile關鍵字,synchronized和final關鍵字也可以實現可見性哦!

“白話”可見性,原子性,有序性!Java併發必備知識幾分鐘就記住

可見性就像一個廣播

什麼是有序性

《深入瞭解Java虛擬機》中對有序性有一句經典的解釋:如果在本線程內觀察,所有的操作都是有序的;如果在一個線程中觀察另一個線程,所有的操作都是無序的。這本書中也對這兩句話進行了解釋,前半句說的就是,在一個線程內會表現出串行的語義;後半句說的就是Java的“指令重排序”和“工作內存與主內存同步延遲”的現象,關於這兩部分的具體解釋可以參考小編之前的文章。

在Java中,保證有序性可以使用volatile和synchronized兩個關鍵字來實現。volatile禁止了指令重排序來保證有序性,synchronized則是保證了持有同一個鎖的兩部分代碼只能串行進入。

“白話”可見性,原子性,有序性!Java併發必備知識幾分鐘就記住

有序性

關於可見性,原子性,有序性的講解就到這裡,小夥伴們有沒有發現,synchronized是萬能的,不管是可見性,還是原子性,甚至是有序性,synchronized都可以搞定!。

有任何問題,小夥伴們都可以在評論中留言與小編進行交流,歡迎收藏、轉發和關注哦!

老規矩,程序員鼓勵師!

“白話”可見性,原子性,有序性!Java併發必備知識幾分鐘就記住

可能是一個女生程序員


分享到:


相關文章: