天天看點

transient,volatile和strictfp關鍵字(轉)

Java中的transient,volatile和strictfp關鍵字 

    如果用transient聲明一個執行個體變量,當對象存儲時,它的值不需要維持。例如: 

 寫道 class T {

transient int a; //不需要維持

int b; //需要維持

}   這裡,如果T類的一個對象寫入一個持久的存儲區域,a的内容不被儲存,但b的将被儲存。 

    volatile修飾符告訴編譯器被volatile修飾的變量可以被程式的其他部分改變。在多線程程式中,有時兩個或更多的線程共享一個相同的執行個體變量。考慮效率問題,每個線程可以自己儲存該共享變量的私有拷貝。實際的變量副本在不同的時候更新,如當進入synchronized方法時。 

    用strictfp修飾類或方法,可以確定浮點運算(以及所有切斷)正如早期的Java版本那樣準确。切斷隻影響某些操作的指數。當一個類被strictfp修飾,所有的方法自動被strictfp修飾。 

    strictfp的意思是FP-strict,也就是說精确浮點的意思。在Java虛拟機進行浮點運算時,如果沒有指定strictfp關鍵字時,Java的編譯器以及運作環境在對浮點運算的表達式是采取一種近似于我行我素的行為來完成這些操作,以緻于得到的結果往往無法令你滿意。而一旦使用了strictfp來聲明一個類、接口或者方法時,那麼所聲明的範圍内Java的編譯器以及運作環境會完全依照浮點規範IEEE-754來執行。是以如果你想讓你的浮點運算更加精确,而且不會因為不同的硬體平台所執行的結果不一緻的話,那就請用關鍵字strictfp。 

你可以将一個類、接口以及方法聲明為strictfp,但是不允許對接口中的方法以及構造函數聲明strictfp關鍵字,例如下面的代碼: 

1. 合法的使用關鍵字strictfp 

 寫道 strictfp interface A {}

public strictfp class FpDemo1 {

strictfp void f() {}

}

 2. 錯誤的使用方法 

 寫道 interface A {

strictfp void f();

}

public class FpDemo2 {

strictfp FpDemo2() {}

}  一旦使用了關鍵字strictfp來聲明某個類、接口或者方法時,那麼在這個關鍵字所聲明的範圍内所有浮點運算都是精确的,符合IEEE-754規範的。例如一個類被聲明為strictfp,那麼該類中所有的方法都是strictfp的。 

Keys: volatile 

使用對象:字段 

介紹:因為異步線程可以通路字段,是以有些優化操作是一定不能作用在字段上的。volatile有時 

可以代替synchronized。 

Keys:transient 

  使用對象:字段 

  介紹:字段不是對象持久狀态的一部分,不應該把字段和對象一起串起。