歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java 那些鮮為人知的保留字

Java 那些鮮為人知的保留字

日期:2017/3/1 9:35:54   编辑:Linux編程

一:Java中的instanceof關鍵字

(1)定義:instanceof是Java的一個二元操作符,和==,>,<是同一類東東。由於它是由字母組成的,所以也是Java的保留關鍵字。

它的作用是測試它左邊的對象是否是它右邊的類的實例,返回boolean類型的數據。

(2)示例: instanceof有一些用處。比如我們寫了一個處理賬單的系統,其中有這樣三個類:

  public class Bill {//省略細節}

  public class PhoneBill extends Bill {//省略細節}

  public class GasBill extends Bill {//省略細節}

  在處理程序裡有一個方法,接受一個Bill類型的對象,計算金額。假設兩種賬單計算方法不同,而傳入的Bill對象可能是兩種中的任何一種,所以要用instanceof來判斷:

public double calculate(Bill bill) {
  if (bill instanceof PhoneBill)
  //計算電話賬單
  }
  if (bill instanceof GasBill) {
  //計算燃氣賬單
  }
  ...
  }
  這樣就可以用一個方法處理兩種子類。

然而,這種做法通常被認為是沒有好好利用面向對象中的多態性。其實上面的功能要求用方法重載完全可以實現,這是面向對象變成應有的做法,避免回到結構化編程模式。只要提供兩個名字和返回值都相同,接受參數類型不同的方法就可以了:

 public double calculate(PhoneBill bill) {
  //計算電話賬單
  }

  public double calculate(GasBill bill) {
  //計算燃氣賬單
  }

(3)所以,使用instanceof在絕大多數情況下並不是推薦的做法,應當好好利用多態;當然為了簡單有時也是可以的。

二:java volatile 關鍵字

(1)就像大家更熟悉的const一樣,volatile是一個類型修飾符(type specifier)。它是被設計用來修飾被不同線程訪問和修改的變量。

如果沒有volatile,基本上會導致這樣的結果:要麼無法編寫多線程程序,要麼編譯器失去大量優化的機會。

(2)一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器裡的備份。下面是volatile變量的幾個例子:

1). 並行設備的硬件寄存器(如:狀態寄存器)

2). 一個中斷服務子程序中會訪問到的非自動變量(Non-automatic variables)

3). 多線程應用中被幾個任務共享的變量

這是區分C程序員和嵌入式系統程序員的最基本的問題:嵌入式系統程序員經常同硬件、中斷、RTOS等等打交道,所有這些都要求使用volatile變量。不懂得volatile內容將會帶來災難。(非嵌入式的可以不用看了)

(3)與鎖相比,Volatile變量是一種非常簡單但同時又非常脆弱的同步機制,它在某些情況下將提供優於鎖的性能和伸縮性。如果嚴格遵循 volatile 的使用條件 —— 即變量真正獨立於其他變量和自己以前的值 —— 在某些情況下可以使用 volatile 代替 synchronized 來簡化代碼。然而,使用 volatile 的代碼往往比使用鎖的代碼更加容易出錯。本文介紹的模式涵蓋了可以使用 volatile 代替 synchronized 的最常見的一些用例。遵循這些模式(注意使用時不要超過各自的限制)可以幫助您安全地實現大多數用例,使用 volatile變量獲得更佳性能。

三:java synchronized 關鍵字

(1) synchronized 關鍵字,代表這個方法加鎖,相當於不管哪一個線程(例如線程A),運行到這個方法時,都要檢查有沒有其它線程B(或者C、 D等)正在用這個方法,有的話要等正在使用synchronized方法的線程B(或者C 、D)運行完這個方法後再運行此線程A,沒有的話,直接運行。它包括兩種用法:synchronized 方法和 synchronized 塊,同一時刻最多只有一個線程執行這個段代碼。

(2)synchronized 方法

1.方法聲明時使用,放在范圍操作符(public等)之後,返回類型聲明(void等)之前.這時,線程獲得的是成員鎖,即一次只能有一個線程進入該方法,其他線程要想在此時調用該方法,只能排隊等候,當前線程(就是在synchronized方法內部的線程)執行完該方法後,別的線程才能進入.例如:

public synchronized void synMethod(){
  //方法體
  }
2.對某一代碼塊使用,synchronized後跟括號,括號裡是變量,這樣,一次只有一個線程進入該代碼塊.此時,線程獲得的是成員鎖.例如:
public int synMethod(int a1){
  synchronized(a1){
  //一次只能有一個線程進入
  }
}

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-12/111008p2.htm

Copyright © Linux教程網 All Rights Reserved