transient:
java有個(gè)特點(diǎn)就是序列化,簡單地來說就是可以將這個(gè)類存儲(chǔ)在物理空間(當(dāng)然還是以文件的形式存在),那么當(dāng)你從本地還原這個(gè)文件時(shí),你可以將它轉(zhuǎn)換為它本身。這可以極大地方便網(wǎng)絡(luò)上的一些操作,但同時(shí),因?yàn)樯婕暗桨踩珕栴},所以并不希望把類里面所有的東西都能存儲(chǔ)(因?yàn)槟菢樱瑒e人可以通過序列化知道類里面的內(nèi)容),那么我們就可以用上transient這個(gè)關(guān)鍵字,它的意思是臨時(shí)的,即不會(huì)隨類一起序列化到本地,所以當(dāng)還原后,這個(gè)關(guān)鍵字定義的變量也就不再存在。
volatile:
Volatile 修飾的成員變量在每次被線程訪問時(shí),都強(qiáng)迫從共享內(nèi)存中重讀該成員變量的值。而且,當(dāng)成員變量發(fā)生變化時(shí),強(qiáng)迫線程將變化值回寫到共享內(nèi)存。這樣在任何時(shí)刻,兩個(gè)不同的線程總是看到某個(gè)成員變量的同一個(gè)值。
Java 語言規(guī)范中指出:為了獲得最佳速度,允許線程保存共享成員變量的私有拷貝,而且只當(dāng)線程進(jìn)入或者離開同步代碼塊時(shí)才與共享成員變量的原始值對比。
這樣當(dāng)多個(gè)線程同時(shí)與某個(gè)對象交互時(shí),就必須要注意到要讓線程及時(shí)的得到共享成員變量的變化。
而volatile關(guān)鍵字就是提示VM:對于這個(gè)成員變量不能保存它的私有拷貝,而應(yīng)直接與共享成員變量交互。
使用建議:在兩個(gè)或者更多的線程訪問的成員變量上使用volatile。當(dāng)要訪問的變量已在synchronized代碼塊中,或者為常量時(shí),不必使用。
由于使用volatile屏蔽掉了VM中必要的代碼優(yōu)化,所以在效率上比較低,因此一定在必要時(shí)才使用此關(guān)鍵字。
posted on 2010-06-14 23:03
lincode 閱讀(226)
評論(0) 編輯 收藏 所屬分類:
Java