jre5
publicclass lazysingleton2
return
m_instance;
}//getinstance
}//class
在上面的下劃線處會出現問題。
無法保證編譯器為物件分配記憶體之後,是直接將物件的引用賦值給m_instance
,還是將物件初始化之後才將引用賦值給
m_instance
。如果是前者,其它執行緒可能獲得沒有初始化的物件的引用,這將導致嚴重的問題。
產生問題的可能編譯方式:偽**描述
mem = allocate(); //allocate memory for singleton object.此外,因為編譯器會進行指令重排序優化,上述偽**之間可以還會插入其它指令。使得mem所引用物件的初始化操作會延後執行,進而增加了其它執行緒取得未初始物件的可能性。instance = mem; //note that instance is now non-null, but
has not been initialized.other thread may be come at this point.
lazysingleton2(instance);
//invoke constructor for singleton passing
保證jre版本在5.0及以上,並為
m_instance 新增volatile關鍵字。volatile關鍵字有兩個效果:一是對所有執行緒可見;二是禁止指令重排序優化。
由於類似的原因,下面的這種**可能會出錯。
objecta = objecta + objecta + objectb;
當編譯器先分配新物件的空間,然後直接將引用賦值給objecta
。那麼在之後試圖利用原來的
objecta
引用的物件來初始化新物件時就會出現問題,因為此時
objecta
已經指向了新分配的物件空間。
VC編譯器與GCC編譯器的區別
今天無意寫了一段 發現了vc編譯器與gun的gcc編譯器還是存在區別的。畢竟gcc支援的是標準c。include struct node int main 上述 在gcc下是編譯失敗的,提示的錯誤 uknown typename node 但是放到vc編譯器下則順利編譯通過。於是按照標準c寫了另外乙...
如何檢測編譯器的大小端
大端模式 所謂的大端模式,是指資料的高位,儲存在記憶體的低位址中,而資料的低位,儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 小端模式 所謂的小端模式,是指資料的高位儲存在記憶體的高位址中,而數 據的低位儲存在記憶體的低位址中,這種...
使用xmake檢測編譯器特性支援
如果我們要寫跨平台的c c 很多時候需要處理由於不同編譯器對c c 各個標準支援力度不同導致的相容性問題,一般通常的解決辦法是 自己在 中通過巨集去判斷各個編譯器的版本 內建巨集 標準庫巨集 has feature等來檢測處理。自己如果在 中按上述的方式檢測,會很繁瑣,尤其是像c 這種存在大量語法特...