本科的畢業設計做的是乙個android小程式--鄭大小秘書,做完這個,感覺是對自己整體能力的提公升。期末結束了,大家對考試成績都特別的關注,時不時的檢視一下自己的成績。由於查分人數的增加,昨天發現伺服器已經宕掉。看了一下對應的tomcat日誌,看到一下錯誤:
根據日誌以及 j**a.util.concurrentmodificationexception快速的定位到相應類的相應行,檢視了一下**。因為以前自己也遇到這種問題,所以也很快的發現是自己定義的乙個靜態集合變數,在多個執行緒中併發訪問,違背了j**a中的fail-fast原則,雖然自己在**中使用synchronized來使執行緒同步,但是靜態變數的操作卻不僅僅是在synchronized方法中,在synchronized方法外,有對集合變數的傳遞,這就造成了傳遞前可能變數內容已經更改。
小秘書的目前使用者有盡4000人,每天活躍人數900多人,啟動5000多次,放假之前的訪問量大概是當前的一半,所以查成績時一人查詢成績時伺服器完成上一次成績查詢操作並返回使用者結果,那麼這個錯誤就將被隱藏起來,現在訪問量大了之後,問題就暴露出來了。去掉集合變數前的static後,每次呼叫新建乙個變數,問題解決,也不在出現這樣的錯誤。
通過這一次的小事故,使我進一步對j**a中變數的修飾符有了進一步的認識,修飾變數前,一定要考慮變數的是否公開(public,private等),是否需要支援併發訪問(synchronized,static等),是否只能更改一次(final)等。每個修飾符都有自己獨有的功能和意義,使用時一定要分清楚。
static修飾符的使用
static修飾符能修飾內部類,方法,變數,塊。靜態 成員意味著該成員屬於類級,而不依賴於類的例項,也不依賴於任何乙個類的成員,可以不通過建立類的例項來使用靜態成員。靜態變數在類被加載入時初始化,乙個類只有乙個靜態變數的記憶體空間,而不會依賴於物件再次分配空間。區域性變數不能被宣告為靜態變數。靜態方...
final修飾符 final乙個物件
public class box void printbox public static void main string args final修飾乙個物件,那麼這個物件的引用不能變,但是值是可以變的。final box boxobj new box 25 簡單的說,這個boxobj 只能new一次...
static修飾符的作用及應用
資料共享 成員變數 例項變數 和靜態變數 類變數 的區別 兩個變數的生命週期不同 成員變數隨物件的建立而存在,隨物件被 而釋放 靜態變數隨類的載入而存在,隨類的消失而消失 呼叫方式不同 成員變數只能被物件呼叫 靜態變數還可以被類名呼叫 資料儲存位置不同 成員變數 堆記憶體的物件中,也叫物件的特有資料...