有關volatile關鍵字和transient關鍵字

有關volatile關鍵字和transient關鍵字

(1)volatile關鍵字['vɑlətl]的作用

讓變量每次在使用的時候,都從主存中取,而不是從各個線程的“工作內存”。

也就是說,volatile變量對於每次使用,線程都能得到當前volatile變量的最新值.

 

(2)volatile與synchronized區別

複製代碼

volatile具有synchronized關鍵字的“可見性”,但是沒有synchronized關鍵字的“併發正確性”,也就是說不保證線程執行的有序性。

也就是說,volatile變量對於每次使用,線程都能得到當前volatile變量的最新值。但是volatile變量並不保證併發的正確性。

1.volatile本質是在告訴jvm當前變量在寄存器(工作內存)中的值是不確定的,需要從主存中讀取;synchronized則是鎖定當前變量,只有當前線程可以訪問該變量,其他線程被阻塞住
2.volatile僅能使用在變量級別;synchronized則可以使用在變量、方法、和類級別的。
3.volatile僅能實現變量的修改可見性,並能保證原子性;而synchronized則可以保證變量的修改可見性和原子性。
4.volatile不會造成線程的阻塞;synchronized可能會造成線程的阻塞。 
5.volatile標記的變量不會被編譯器優化;synchronized標記的變量可以被編譯器優化。

複製代碼

 (3)什麼是線程的working memory

複製代碼

線程的working memory是cpu的寄存器和高速緩存的抽象描述:現在的計算機,cpu在計算的時候,並不總是從內存讀取數據,它的數據讀取順序優先級 是:寄存器-高速緩存-內存。
線程耗費的是CPU,線程計算的時候,原始的數據來自內存,在計算過程中,有些數據可能被頻繁讀取,這些數據被存儲在寄存器和高速緩存中,當線程計算完後,這些緩存的數據在適當的時候應該寫回內存。當多個線程同時讀寫某個內存數據時,就會產生多線程併發問題,涉及到三個特 性:原子性,有序性,可見性。 支持多線程的平臺都會面臨 這種問題,運行在多線程平臺上支持多線程的語言應該提供解決該問題的方案。

簡而言之:每個線程都有自己的執行空間(即工作內存),線程執行的時候用到某變量,首先要將變量從主內存拷貝的自己的工作內存空間,然後對變量進行操作:讀取,修改,賦值等,這些均在工作內存完成,操作完成後再將變量寫回主內存;

複製代碼

 

(4)產生線程安全的原因 

由上可知,各個線程都從主內存中獲取數據,線程之間數據是不可見的;打個比方:主內存變量A原始值爲1,線程1從主內存取出變量A,修改A的值爲2,在線程1未將變量A寫回主內存的時候,線程2拿到變量A的值仍然爲1;這便引出“可見性”的概念:當一個共享變量在多個線程的工作內存中都有副本時,如果一個線程修改了這個共享變量的副本值,那麼其他線程應該能夠看到這
個被修改後的值,這就是多線程的可見性問題。

 

 transient:用來表示一個域不是該對象串行化的一部分,當一個對象被串行化的時候,transient型變量的值不包括在串行化的表示中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章