使用 volatile 必須具備的條件
對(duì)變量的寫(xiě)操作不依賴于當(dāng)前值。該變量沒(méi)有包含在具有其他變量的不變式中。只有在狀態(tài)真正獨(dú)立于程序內(nèi)其他內(nèi)容時(shí)才能使用 volatile。
例子 1: 單例模式
單例模式的一種實(shí)現(xiàn)方式,但很多人會(huì)忽略 volatile 關(guān)鍵字,因?yàn)闆](méi)有該關(guān)鍵字,程序也可以很好的運(yùn)行,只不過(guò)代碼的穩(wěn)定性總不是 100%,說(shuō)不定在未來(lái)的某個(gè)時(shí)刻,隱藏的 bug 就出來(lái)了。
例子2: volatile bean
在 volatile bean 模式中,JavaBean 的所有數(shù)據(jù)成員都是 volatile 類型的,并且 getter 和 setter 方法必須非常普通 —— 除了獲取或設(shè)置相應(yīng)的屬性外,不能包含任何邏輯。此外,對(duì)于對(duì)象引用的數(shù)據(jù)成員,引用的對(duì)象必須是有效不可變的。(這將禁止具有數(shù)組值的屬性,因?yàn)楫?dāng)數(shù)組引用被聲明為 volatile 時(shí),只有引用而不是數(shù)組本身具有 volatile 語(yǔ)義)。對(duì)于任何 volatile 變量,不變式或約束都不能包含 JavaBean 屬性。