淺談java中源碼常見的幾個關鍵字(native,strictfp,transient,volatile)

最近看源碼總髮現一些沒見過的關鍵字,今天就來整理一下
native,strictfp,transient,volatilehtml

native 本地

native是與C++聯合開發的時候用的!java本身開發不用的! java

使用native關鍵字說明這個方法是原生函數,也就是這個方法是用C/C++語言實現的,而且被編譯成了DLL,由java去調用。c++

這些函數的實現體在DLL中,JDK的源代碼中並不包含,你應該是看不到的。對於不一樣的平臺它們也是不一樣的。這也是java的底層機制,實際上java就是在不一樣的平臺上調用不一樣的native方法實現對操做系統的訪問的。
一、native 是用作java 和其餘語言(如c++)進行協做時用的 也就是native 後的函數的實現不是用java寫的
二、既然都不是java,那就別管它的源代碼了,呵呵native的意思就是通知操做系統, 這個函數你必須給我實現,由於我要使用。 因此native關鍵字的函數都是操做系統實現的, java只能調用。java是跨平臺的語言,既然是跨了平臺,所付出的代價就是犧牲一些對底層的控制,而java要實現對底層的控制,就須要一些其餘語言的幫助,這個就是native的做用了。git

strictfp 嚴格,精準

strictfp的意思是FP-strict,也就是說精確浮點的意思。在Java虛擬機進行浮點運算時,若是沒有指定strictfp關鍵字時,Java的編譯器以及運行環境在對浮點運算的表達式是採起一種近似於我行我素的行爲來完成這些操做,以至於獲得的結果每每沒法使人滿意。而一旦使用了strictfp來聲明一個類、接口或者方法時,那麼所聲明的範圍內Java的編譯器以及運行環境會徹底依照浮點規範IEEE-754來執行。
所以若是想讓浮點運算更加精確,並且不會由於不一樣的硬件平臺所執行的結果不一致的話,那就請用關鍵字strictfp。(感受實際開發中用bigdecimal能解決這個問題)github

能夠將一個類、接口以及方法聲明爲strictfp,可是不容許對接口中的方法以及構造函數聲明strictfp關鍵字。編程

示例:緩存

public strictfp class MyClass   {   
  
  public static void main(String[] args)   {   
  
      float aFloat = 0.6710339f;   
  
      double aDouble = 0.04150553411984792d;   
  
      double sum = aFloat + aDouble;   
  
      float quotient = (float)(aFloat / aDouble);   
  
      System.out.println("float: " + aFloat);   
  
      System.out.println("double: " + aDouble);   
  
      System.out.println("sum: " + sum);   
  
      System.out.println("quotient: " + quotient);   
  
  }   
  
}  

 輸出:安全

float: 0.6710339  
  
double: 0.04150553411984792  
  
sum: 0.71253945297742238  
  
quotient: 16.1673355   

  

transient 短暫

咱們都知道一個對象只要實現了Serilizable接口,這個對象就能夠被序列化,java的這種序列化模式爲開發者提供了不少便利,咱們能夠沒必要關係具體序列化的過程,只要這個類實現了Serilizable接口,這個類的全部屬性和方法都會自動序列化。網絡

然而在實際開發過程當中,咱們經常會遇到這樣的問題,這個類的有些屬性須要序列化,而其餘屬性不須要被序列化,打個比方,若是一個用戶有一些敏感信息(如密碼,銀行卡號等),爲了安全起見,不但願在網絡操做(主要涉及到序列化操做,本地序列化緩存也適用)中被傳輸,這些信息對應的變量就能夠加上transient關鍵字。換句話說,這個字段的生命週期僅存於調用者的內存中而不會寫到磁盤裏持久化。多線程

總之,java 的transient關鍵字爲咱們提供了便利,你只須要實現Serilizable接口,將不須要序列化的屬性前添加關鍵字transient,序列化對象的時候,這個屬性就不會序列化到指定的目的地中。

volatile 易失

在Java多線程併發編程中,volatile關鍵詞扮演着重要角色,它是輕量級的synchronized,在多處理器開發中保證了共享變量的「可見性」。「可見性」的意思是當一個線程修改一個共享變量時,另一個線程能讀到這個修改的值。若是一個字段被聲明爲volatile,Java線程內存模型確保全部線程看到這個變量的值是一致的。與synchronized不一樣,volatile變量不會引發線程上下文的切換和調度,在適合的場景下擁有更低的執行成本和更高的效率。

Volatile修飾的成員變量在每次被線程訪問時,都強迫從主內存中重讀該成員變量的值。並且,當成員變量發生變化時,強迫線程將變化值回寫到主內存。這樣在任什麼時候刻,兩個不一樣的線程老是看到某個成員變量的同一個值。

 

 

參考地址:

http://www.cnblogs.com/lanxuezaipiao/p/3369962.html 

https://crowhawk.github.io/2018/02/10/volatile/

https://www.cnblogs.com/dolphin0520/p/3920373.html

相關文章
相關標籤/搜索