Java transient關鍵字。本站提示廣大學習愛好者:(Java transient關鍵字)文章只能為提供參考,不一定能成為您想要的結果。以下是Java transient關鍵字正文
Volatile修飾的成員變量在每次被線程訪問時,都強迫從主內存中重讀該成員變量的值。而且,當成員變量發作變化時,強迫線程將變化值回寫到主內存。這樣在任何時辰,兩個不同的線程總是看到某個成員變量的同一個值。
Java言語標准中指出:為了取得最佳速度,允許線程保管共享成員變量的公有拷貝,而且只當線程進入或許分開同步代碼塊時才與共享成員變量的原始值比照。
這樣當多個線程同時與某個對象交互時,就必需要留意到要讓線程及時的失掉共享成員變量的變化。
而volatile關鍵字就是提示VM:關於這個成員變量不能保管它的公有拷貝,而應直接與共享成員變量交互。
運用建議:在兩個或許更多的線程訪問的成員變量上運用volatile。當要訪問的變量已在synchronized代碼塊中,或許為常量時,不用運用。
由於運用volatile屏蔽掉了VM中必要的代碼優化,所以在效率上比擬低,因而一定在必要時才運用此關鍵字。
java關鍵字Transient
轉自http://horst.sun.blog.163.com/blog/static/348849612007614494492/
轉自http://www.blogjava.net/fhtdy2004/archive/2009/06/20/286112.html
翻譯自http://www.devx.com/tips/Tip/13726。
Java的serialization提供了一種耐久化對象實例的機制。當耐久化對象時,能夠有一個特殊的對象數據成員,我們不想
用serialization機制來保管它。為了在一個特定對象的一個域上封閉serialization,可以在這個域前加上關鍵字transient。
transient是Java言語的關鍵字,用來表示一個域不是該對象串行化的一局部。當一個對象被串行化的時分,transient型變量的值不包括在串行化的表示中,但是非transient型的變量是被包括出來的。
留意static變量也是可以串行化的
首先,讓我們看一些Java serialization的代碼:
public class LoggingInfo implements java.io.Serializable
{
private Date loggingDate = new Date();
private String uid;
private transient String pwd;
LoggingInfo(String user, String password)
{
uid = user;
pwd = password;
}
public String toString()
{
String password=null;
if(pwd == null)
{
password = "NOT SET";
}
else
{
password = pwd;
}
return "logon info: \n " + "user: " + uid +
"\n logging date : " + loggingDate.toString() +
"\n password: " + password;
}
}
如今我們創立一個這個類的實例,並且串行化(serialize)它 ,然後將這個串行化對象寫如磁盤。
LoggingInfo logInfo = new LoggingInfo("MIKE", "MECHANICS");
System.out.println(logInfo.toString());
try
{
ObjectOutputStream o = new ObjectOutputStream(
new FileOutputStream("logInfo.out"));
o.writeObject(logInfo);
o.close();
}
catch(Exception e) {//deal with exception}
To read the object back, we can write
try
{
ObjectInputStream in =new ObjectInputStream(
new FileInputStream("logInfo.out"));
LoggingInfo logInfo = (LoggingInfo)in.readObject();
System.out.println(logInfo.toString());
}
catch(Exception e) {//deal with exception}
假如我們運轉這段代碼,我們會留意到從磁盤中讀回(read——back (de-serializing))的對象打印password為"NOT SET"。這是當我們定義pwd域為transient時,所希冀的正確後果。
如今,讓我們來看一下大意看待transient域能夠惹起的潛在問題。假定我們修正了類定義,提供應transient域一個默許值,
代碼如下:
public class GuestLoggingInfo implements java.io.Serializable
{
private Date loggingDate = new Date();
private String uid;
private transient String pwd;
GuestLoggingInfo()
{
uid = "guest";
pwd = "guest";
}
public String toString()
{
//same as above
}
}
如今,假如我們穿行化GuestLoggingInfo的一個實例,將它寫入磁盤,並且再將它從磁盤中讀出,我們依然看到讀回的對象打印password 為 "NOT SET"。當從磁盤中讀出某個類的實例時,實踐上並不會執行這個類的結構函數,
而是載入了一個該類對象的耐久化形態,並將這個形態賦值給該類的另一個對象。