天天看點

Java中的特殊關鍵字

說他特殊,是因為C++中沒有或意思有變化:

final:

final修飾的類,和方法都很好了解。

關鍵是final修飾的函數變量,如void pro(final String str);

final 關鍵字保證對被final修飾的變量隻能指派一次,也就是說final不能再指向别的變量了。但是被指的這個變量還是可以改變的。

使用final修飾符不僅會保持對象不會改變,而且編譯器還會持續維護這個對象在回調方法中的生命周期.是以這才是final 

變量和final參數的根本意義. 

http://czjxdm.iteye.com/blog/210451#bc2220516

native:

該關鍵字使用者Java調用其他語言所寫的代碼的時候。JNI (Java Native Inteface)标準制定的。

strictfp:

精确浮點計算。用來修飾interface 和 class以及函數(構造函數和接口中的方法除外)。

所聲明的範圍内Java的編譯器以及運作環境會完全依照浮點規範IEEE-754來執行。 

synchronized:

由于同一程序的多個線程共享同一片存儲空間,在帶來友善的同時,也帶來了通路沖突這個嚴重的問題。Java語言提供了專門機制以解決這種沖突,有效避免了同一個資料對象被多個線程同時通路。 

1.修飾對象執行個體,放在非靜态方法前面。作為synchronized方法。鎖用在類對象上。

是某個對象執行個體内,synchronized aMethod(){}可以防止多個線程同時通路這個對象的synchronized方法(如果一個對象有多個synchronized方法,隻要一個線程通路了其中的一個synchronized方法,其它線程不能同時通路這個對象中任何一個synchronized方法)。這時,不同的對象執行個體的 synchronized方法是不相幹擾的。也就是說,其它線程照樣可以同時通路相同類的另一個對象執行個體中的synchronized方法; 

2.修飾類,放在類的靜态方法前面。所用在類上。

是某個類的範圍,synchronized static aStaticMethod{}防止多個線程同時通路這個類中的synchronized static 方法。它可以對類的所有對象執行個體起作用。 

3.除了方法前用synchronized關鍵字,synchronized關鍵字還可以用于方法中的某個區塊中,表示隻對這個區塊的資源實行互斥通路。用法是: synchronized(this){},它的作用域是目前對象。 這時鎖就是對象,誰拿到這個鎖誰就可以運作它所控制的那段代碼。當有一個明确的對象作為鎖時,就可以這樣寫程式,但當沒有明确的對象作為鎖,隻是想讓一段代碼同步時,可以建立一個特殊的instance變量(它得是一個對象)來充當鎖。

synchronized關鍵字是不能繼承的。

transient:

Java的serialization提供了一種持久化對象執行個體的機制。當持久化對象時,可能有一個特殊的對象資料成員,我們不想用serialization機制來儲存它。為了在一個特定對象的一個域上關閉serialization,可以在這個域前加上關鍵字transient。

transient是Java語言的關鍵字,用來表示一個域不是該對象串行化的一部分。當一個對象被串行化的時候,transient型變量的值不包括在串行化的表示中,然而非transient型的變量是被包括進去的。

volatile:

Volatile修飾的成員變量在每次被線程通路時,都強迫從共享記憶體中重讀該成員變量的值。而且,當成員變量發生變化時,強迫線程将變化值回寫到共享記憶體。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。
Java語言規範中指出:為了獲得最佳速度,允許線程儲存共享成員變量的私有拷貝,而且隻當線程進入或者離開同步代碼塊時才與共享成員變量的原始值對比。
這樣當多個線程同時與某個對象互動時,就必須要注意到要讓線程及時的得到共享成員變量的變化。
而volatile關鍵字就是提示VM:對于這個成員變量不能儲存它的私有拷貝,而應直接與共享成員變量互動。
使用建議:在兩個或者更多的線程通路的成員變量上使用volatile。當要通路的變量已在synchronized代碼塊中,或者為常量時,不必使用。
由于使用volatile屏蔽掉了VM中必要的代碼優化,是以在效率上比較低,是以一定在必要時才使用此關鍵字。