Java編譯器與雙鎖檢測

2021-06-13 10:03:11 字數 1119 閱讀 2228

jre5

public

class lazysingleton2 

return

m_instance;

}//getinstance

}//class

在上面的下劃線處會出現問題。

無法保證編譯器為物件分配記憶體之後,是直接將物件的引用賦值給m_instance

,還是將物件初始化之後才將引用賦值給

m_instance

。如果是前者,其它執行緒可能獲得沒有初始化的物件的引用,這將導致嚴重的問題。

產生問題的可能編譯方式:偽**描述

mem = allocate();            //allocate memory for singleton object.

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

此外,因為編譯器會進行指令重排序優化,上述偽**之間可以還會插入其它指令。使得mem所引用物件的初始化操作會延後執行,進而增加了其它執行緒取得未初始物件的可能性。

保證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 這種存在大量語法特...