|
下面的類計算并緩存了一個總和,并且在另一個類中打印這個總和
class Cache{
static {
initializeIfNecessary();
}
private static int sum;
public static int getSum(){
initializeIfNecessary();
return sum;
}
private static boolean initialized = false;
private static synchronized void initializeIfNecessary(){
if(!initialized){
for(int i=0; i < 100; i++ )
sum+=i;
initialized = true;
}
}
}
pubic class Client {
pubilc static void main(String[] args){
System.out.println(Cache.getSum());
}
}
程序是一個典型的半開循環,應該打印出1到99的整數總和,即4950,但程序運行打印的為9900,是預期值的兩倍。
程序在確保sum在使用之前就已經初始化這個問題上,遇到了麻煩。程序結合了惰性初始化和積極初始化,還使用上了同步,以確保緩存在多線程環境下也能工作,但程序無法完成預期的工作。
程序輸出打印是控制標志initialized 的問題。qq上一個朋友問的一本書里的問題,我也找到那本書了,是惰性初始化(static初始化)的問題,控制標志在static完成初始化后又重新被構造器賦值為false,初始化總和值的方法被執行了兩次。
大概一年以前參與到一個大型信息管理軟件系統的維護工作中,這個系統是B/S結構,主要負責某省煤炭資源運銷管理,應用在了鐵路這個渠道管理上,我們的主要的系統維護工作重心在鐵路管理維護上,另外還負責一些網站信息發布管理功能的維護。這個管理系統有自己的一套網絡體系,因為我并沒有參與其中的網絡體系的搭建與后期的維護工作,只是大概的了解一些:
1.網絡體系的結構為樹狀拓撲結構,主要依據該公司的組織機構建立,該公司組織機構分為總公司一級,分公司一級,縣級公司一級以及直接負責煤炭運銷具體的工作的公司一級。網絡體系以此而建,也分為四級網絡。
2.使用一套c/s體系的軟件,完成基礎數據的收集,并定時上報到縣級公司或者直屬的分公司,然后將數據匯總分析后通過這套軟件提交,統一儲存到總公司數據庫服務器。
3.根據該行業的業務,每年全省的煤炭運量,特別是通過鐵路渠道的運量,在年初通過簽訂的全年合同決定,該年的業務也以此運量為準。
這套軟件成型與2002年,在當時的條件限制下這是一套最為有效的軟件工作體系了,但也有其缺陷:
1. 盡管基礎數據收集大都已經為通過電子稱量系統實現自動數據提取,但在上報過程中,仍有可能對數據進行篡改,軟件為此專門增設了一個子功能系統,但使用情況不容樂觀,收效甚微。
2. 數據統一存儲在總公司數據庫服務器中,方便管理,在最初的設計中,數據庫沒有設計負載分流以及鏡像備份的等處理,隨著系統的使用,數據量的增加,數據庫負載增大,軟件反應速度越來越慢。
這個缺陷在今年年初運量提報和每個月初的各個分公司的運量提報中尤為明顯,數據庫出現多次當機情況,處理過多次,但收效不明顯,在使用高峰期需要注意數據庫的使用情況。
這個系統的網絡部分就寫這么多吧,畢竟不太熟悉,還是摻雜了軟件的非網絡部分,:-)。下一篇開始寫這個軟件的web架構部分,主要是mvc框架和dao框架部分。