java volatile關鍵字 transien 關鍵字

1、Volatile關鍵字java

Volatile修飾的成員變量在每次被線程訪問時,都強迫從主內存中重讀該成員變量的值。並且,當成員變量發生變化時,強迫線程將變化值回寫到主內存。這樣在任什麼時候刻,兩個不一樣的線程老是看到某個成員變量的同一個值。   
Java語言規範中指出:爲了得到最佳速度,容許線程保存共享成員變量的私有拷貝,並且只當線程進入或者離開同步代碼塊時才與共享成員變量的原始值對比。   
  這樣當多個線程同時與某個對象交互時,就必需要注意到要讓線程及時的獲得共享成員變量的變化。   
  而volatile關鍵字就是提示VM:對於這個成員變量不能保存它的私有拷貝,而應直接與共享成員變量交互。   
  使用建議:在兩個或者更多的線程訪問的成員變量上使用volatile。當要訪問的變量已在synchronized代碼塊中,或者爲常量時,沒必要使用。   
  因爲使用volatile屏蔽掉了VM中必要的代碼優化,因此在效率上比較低,所以必定在必要時才使用此關鍵字。優化


2、transient關鍵字
spa

一個對象只要實現 Serilizable 接口,這個對象就能夠被序列化,咱們能夠沒必要關係具體序列化的過程,只要這個類實現了Serilizable接口,這個的全部屬性和方法都會自動序列化。線程

然而在實際開發過程當中,咱們經常會遇到這樣的問題,這個類的有些屬性須要序列化,而其餘屬性不須要被序列化,你固然可讓這個類來實現Externalizable接口,這個接口是Serilizable的子接口,可是你必須實現 readExternal 和 writeExternal 方法,你能夠在這兩個方法中實現具體屬性的反序列化和序列化操做。這就意味着你必須在這兩個方法中手工編寫額外的代碼來進行具體屬性的序列化。java的transient關鍵字爲咱們提供了便利,你只須要實現Serilizable接口,將不須要序列化的屬性前添加關鍵字transient,序列化對象的時候,這個屬性就僅存於調用者的內存中而不會寫到磁盤裏持久化。對象

transient關鍵字小結:   接口

1)一旦變量被transient修飾,變量將再也不是對象持久化的一部分,該變量內容在序列化後沒法得到訪問。內存

2)transient關鍵字只能修飾變量,而不能修飾方法和類。注意,本地變量是不能被transient關鍵字修飾的。變量若是是用戶自定義類變量,則該類須要實現Serializable接口。開發

3)被transient關鍵字修飾的變量再也不能被序列化,一個靜態變量無論是否被transient修飾,均不能被序列化。同步

相關文章
相關標籤/搜索