volatile關鍵字和transient關鍵字

Java 語言包含兩種內在的同步機制:同步塊(或方法)和 volatile 變量java

1.volatile 關鍵字-----針對變量的可變性緩存

專業解釋:
volatile關鍵字是個類型修飾符用它聲明的類型變量表示能夠被某些編譯器未知的因素更改,好比:操做系統、硬件或者其它線程等。遇到這個關鍵字聲明的變量,編譯器對訪問該變量的代碼就再也不進行優化,從而能夠提供對特殊地址的穩定訪問。安全

實際例子:
發薪資時,會計每次都把員工叫來登記他們的銀行卡號;一次會計爲了省事,沒有即時登記,用了之前登記的銀行卡號;恰好一個員工的銀行卡丟了,已掛失該銀行卡號;從而形成該員工領不到工資
員工 -- 原始變量地址
銀行卡號 -- 原始變量在寄存器的備份網絡

通俗解釋:
使用該關鍵字的例子以下:
volatile int vint;
當要求使用volatile 聲明的變量的值的時候,系統老是從新從它所在的內存讀取數據,即便它前面的指令剛剛從該處讀取過數據。並且讀取的數據馬上被保存。-----就是以防這個變量的值會隨時改變 每次都是從變量的原始地址取值,不會爲了提升效率優化

常使用的地方
一、中斷服務程序中修改的供其它程序檢測的變量須要加volatile;
二、多任務環境下各任務間共享的標誌應該加volatile;
三、存儲器映射的硬件寄存器一般也要加volatile說明,由於每次對它的讀寫均可能有不一樣意義;
另外,以上這幾種狀況常常還要同時考慮數據的完整性(相互關聯的幾個標誌讀了一半被打斷了重寫),在1中能夠經過關中斷來實現,2 中能夠禁止任務調度,3中則只能依靠硬件的良好設計了。spa

2.transient 關鍵字---針對變量的安全性操作系統

專業解釋
transient java語言的關鍵字,變量修飾符,若是用transient聲明一個實例變量,當對象存儲時,它的值不須要維持。換句話來講就是,用transient關鍵字標記的成員變量不參與序列化過程。線程

通俗解釋
若是一個用戶有一些敏感信息(如密碼,銀行卡號等),爲了安全起見,不但願在網絡操做(主要涉及到序列化操做,本地序列化緩存也適用)中被傳輸,這些信息對應的變量就能夠加上transient關鍵字。換句話說,這個字段的生命週期僅存於調用者的內存中而不會寫到磁盤裏持久化。設計

相關文章
相關標籤/搜索