java_【volatile】【final】

Volatilev

被volatile修飾的變量能夠保證每個線程能夠獲取該變量的最新值,從而避免出現數據髒讀的現象。
(1)實現原理
聲明volatile的變量進行寫操作VM就會向處理器發送一條Lock前綴的指令
1.Lock前綴的指令會引起處理器緩存寫回內存;
2.一個處理器的緩存回寫到內存會導致其他處理器的緩存失效;
3.當處理器發現本地緩存失效後,就會從內存中重讀該變量數據,即可以獲取當前最新值。
(2)內存屏障[阻止指令重排]

Final

原則上:final可以修飾變量,方法和類,用於表示所修飾的內容一旦賦值之後就不會再被改變,比如String類就是一個final類型的類。
1.類變量:必須要在靜態初始化塊中指定初始值或者聲明該類變量時指定初始值,而且只能在這兩個地方之一進行指定;
2.實例變量:必要要在非靜態初始化塊,聲明該實例變量或者在構造器中指定初始值,而且只能在這三個地方進行指定。

(1)final局部變量
public void test(final int a){
final int b;
b = 1;
//b=2 報錯 fianl修飾的局部變量只能進行一次賦值
}

1.當final修飾基本數據類型變量時,不能對基本數據類型變量重新賦值,因此基本數據類型變量不能被改變。
2.引用類型變量而言,它僅僅保存的是一個引用,final只保證這個引用類型變量所引用的地址不會發生改變,即一直引用這個對象,但這個對象屬性是可以改變的。

(2)宏變量

1.使用final修飾符修飾;
2.在定義該final變量時就指定了初始值;
3.該初始值在編譯時就能夠唯一指定。

(3)方法

1.父類的方法被final修飾的時候,子類不能重寫父類的該方法,被final修飾的方法不能夠被子類所重寫
2.被final修飾的方法是可以重載的。

(4)類

當一個類被final修飾時,表名該類是不能被子類繼承的。
不變類
· 使用private和final修飾符來修飾該類的成員變量
· 提供帶參的構造器用於初始化類的成員變量;
· 僅爲該類的成員變量提供getter方法,不提供setter方法,因爲普通方法無法修改fina修飾的成員變量;
· 如果有必要就重寫Object類 的hashCode()和equals()方法,應該保證用equals()判斷相同的兩個對象其Hashcode值也是相等的。
JDK中提供的八個包裝類和String類都是不可變類

(5)Final域重排序規則

1.JMM禁止編譯器把final域的寫重排序到構造函數之外;
2.編譯器會在final域寫之後,構造函數return之前,插入一個storestore屏障這個屏 障可以禁止處理器把final域的寫重排序到構造函數之外。
3.在讀一個對象的final域之前,一定會先讀這個包含這個final域的對象的引用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章