1. 程式人生 > >transient和volatile兩個關鍵字區別

transient和volatile兩個關鍵字區別

transient和volatile兩個關鍵字一個用於物件序列化,一個用於執行緒同步,都是Java中比較高階的話題,簡單總結一下。
transient
transient是型別修飾符,只能用來修飾字段。在物件序列化的過程中,標記為transient的變數不會被序列化。
示例:
class Test {


transient int a; // 不會被持久化


int b; // 持久化


}
當類Test的例項物件被序列化(比如將Test類的例項物件 t 寫入硬碟的文字檔案t.txt中),變數 a 的內容不會被儲存,變數 b 的內容則會被儲存。
參考:
把一個物件的表示轉化為位元組流的過程稱為序列化(也稱為序列化,serialization),從位元組流中把物件重建出來稱為反序列化(也稱為為反序列化,deserialization)。transient 為不應被序列化的資料提供了一個語言級的標記資料方法。
volatile
volatile也是變數修飾符,只能用來修飾變數。volatile修飾的成員變數在每次被執行緒訪問時,都強迫從共享記憶體中重讀該成員變數的值。而且,當成員變數發生變化時,強迫執行緒將變化值回寫到共享記憶體。這樣在任何時刻,兩個不同的執行緒總是看到某個成員變數的同一個值。
在此解釋一下Java的記憶體機制:
Java使用一個主記憶體來儲存變數當前值,而每個執行緒則有其獨立的工作記憶體。執行緒訪問變數的時候會將變數的值拷貝到自己的工作記憶體中,這樣,當執行緒對自己工作記憶體中的變數進行操作之後,就造成了工作記憶體中的變數拷貝的值與主記憶體中的變數值不同。
Java語言規範中指出:為了獲得最佳速度,允許執行緒儲存共享成員變數的私有拷貝,而且只當執行緒進入或者離開同步程式碼塊時才與共享成員變數的原始值對比。
這樣當多個執行緒同時與某個物件互動時,就必須要注意到要讓執行緒及時的得到共享成員變數的變化。
而volatile關鍵字就是提示VM:對於這個成員變數不能儲存它的私有拷貝,而應直接與共享成員變數互動。
使用建議:在兩個或者更多的執行緒訪問的成員變數上使用volatile。當要訪問的變數已在synchronized程式碼塊中,或者為常量時,不必使用。
由於使用volatile遮蔽掉了VM中必要的程式碼優化,所以在效率上比較低,因此一定在必要時才使用此關鍵字。

相關推薦

transientvolatile關鍵字區別

transient和volatile兩個關鍵字一個用於物件序列化,一個用於執行緒同步,都是Java中比較高階的話題,簡單總結一下。transienttransient是型別修飾符,只能用來修飾字段。在物件序列化的過程中,標記為transient的變數不會被序列化。示例:cla

影響序列化的關鍵字transient static

transient:這個關鍵字的作用就是忽略序列化操作,也就是說,當物件中的某個屬性被加上了這個關鍵字後,這個屬性就不會被序列化。這個就不在給出程式碼了,自己可以去嘗試一下,int型別的變數被加上這個關

Java關鍵字transientvolatile小結

java pre txt 關鍵字 代碼 字段 代碼優化 class 保存 transient 類型修飾符,只能用來修飾字段。 在對象序列化的過程中,標記為transient的變量不會被序列化。 class Test { transient int a; // 不

php中array_walk() array_map()函數區別

.html als 就是 gpo map false AR HP www. 兩個函數的共性和區別: 1.傳入這兩個函數的 $value,就是數組中的單一個元素。 2.array_walk() 僅返回true或者false,array_map() 返回處理後的數組; 3.要得

vs中的程序有debugrelease版本的區別

不同的 上進 BE 使用 的區別 debug 存在 通過 最優 vs中的程序有debug和release兩個版本,Debug通常稱為調試版本,通過一系列編譯選項的配合,編譯的結果通常包含調試信息,而且不做任何優化,以為開發 人員提供強大的應用程序調試能力。而Release通

在 SQL 裡描述資料分佈情況的時候,有 Cardinality Selectivity 概念,有什麼區別

What is the difference between cardinality and selectivity? In SQL, cardinality refers to the number of unique values in particular column. So, card

JavaScript中setTimeout()setInterval()定時器的區別使用方法

兩者最直接的區別是: setTimeout()在載入後延遲指定時間去執行一次表示式,只是一次。 setInterval()它從載入後,每隔指定的時間就執行一次表示式 所以要讓一段程式碼, 某個函式以固定頻率重複執行應該使用setInterval()函式 如果讓一段程式碼, 某個函式在

SSHSSM框架的淺顯的區別

      1.SSH框架是Struts+Spring+Hibernate而SSM是指的Spring-MVC+Spring+MyBatis,光從這兩個縮寫就可以看出來,如果比較兩者的區別的話主要比較Struct和Spring-MVC以及Hibernate和MyBatis:

在c#中usingnew這關鍵字有什麼意義

using指令的兩個作用: 1.允許在名稱空間中使用型別,或者為型別建立別名; using System.Text; 或 using Project = PC.MyCompany.Project; 2.允許程式設計師指定使用資源的物件

scipy.sparse中csc_martrixcsr_matrix稀疏矩陣的區別

官方參考文件連結: https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csc_matrix.html https://docs.scipy.org/doc/scipy/reference/ge

微信服務號、訂閱號企業號的區別(運營開發角度)

部落格轉載自:http://blog.csdn.net/u013142781為了以後便於查詢,轉載此部落格,在此感謝原博主的無私分享.一、運營的角度1.1、概括訂閱號:微信最初的形態是一個純粹的社交工具,也就是人與人之間的聯絡工具,其中又分熟人之間的聯絡和陌生人之間的聯絡,於

java中的關鍵字transientvolatile

Java定義了兩類有趣的修飾符:transient和volatile。  1、    transient此為java保留字,告訴JVM以transient宣告的基本型態(primitive type)或物件(object)變數不要序列化,例如敏感性的資料像密碼等。    

SSHSSM框架的淺顯的區別(一)

本人使用過SSH框架一段時間,最後在優化專案的時候決定使用SSM框架,這兩種框架的一些淺顯的區別我在這裡說下: 1.SSH框架是Struct+Spring+Hibernate而SSM是指的Spring-MVC+Spring+MyBatis,光從這兩個縮寫就可以看出來,如果比

loadrunner:文字檢查點web_reg_findweb_find函式的區別

web_reg_find是先註冊(register)後查詢的;使用時將它放在請求語句的前面。 而web_find是查詢前面的請求結果;使用時將它放在請求語句的後面。 另二者的引數也完成不一樣的,web_reg_find引數中SaveCount記錄查詢匹配的次數, web_f

Hadoop 2.6.5 FileSystemConfiguration對象的探究

family 上傳數據 大數 塊大小 緩存 完成 color span 小夥伴 Hadoop 2.6.5 FileSystem和Configuration兩個對象的探究 版權聲明:本文為yunshuxueyuan原創文章,如需轉載,請標明出處。【http://www.

微信服務號、訂閱號企業號的差別(運營開發角度)

通訊錄 href 開發人員 mark number hide 品牌 log 互聯網 一、運營的角度 1.1、概括 訂閱號: 微信最初的形態是一個純粹的社交工具,也就是人與人之間的聯系工具,當中又分熟人之間的聯系和陌生人之間的聯系。於是就誕生了朋友圈

PP1指向了OO1變量(對象)的地址, 而不是OO1的內容(對象的實際地址)——充分證明@是取變量(對象)的地址,而不是變量裏面的內容,夠清楚!

com 告訴 cnblogs src logs es2017 strong bsp html 如圖,為什麽這樣取出來的p,p1的值不一樣呢? 165232328群友庾偉洪告訴我: P和P1指向了O和O1兩個變量(對象)的地址, 而不是O和O1的內容(對象

今天我們來討論一下displayvisibilityCSS屬性。

分享圖片 font images 渲染 大神 -s rdp abi css 在討論著兩個屬性之前我們先來看看HTML標簽的全局屬性。就是可以直接在HTML標簽上直接寫的屬性。 以下是菜鳥教程的截圖: 1.看以下第一個快捷鍵的屬性accesskey;設置的就不多說了。主要就

無聊時寫的俄羅斯方塊(分為SDLQt版本)

app deb fcm cnn 無聊 線程 dac tutorial spi 6213-ChineseZodiac(map) 多線程問題 【CF472G】【XSY2112】DesignTutorial壓位 大家都開始C++0x了,我也來湊熱鬧,今天的主題是《調侃rvalue

Java集合框架上機練習題:編寫一個Book類,該類至少有nameprice屬性。該類要實現Comparable接口,在接口的compareTo()方法.....

ext .cn 數據庫 識別 方法 屬性 set package compareto 編寫一個Book類,該類至少有name和price兩個屬性。該類要實現Comparable接口,在接口的compareTo()方法中規定兩個Book類實例的大小關系為二者的price屬性的