上一篇,一個簡單的單例模式,引起了不少人關注,確實沒想到,
首先,重申一下,這只是作為自己的一個面試記錄,以及思考程序,主要是意識到自己之前在對待靜態變數上的一個錯誤(靜態類,或者帶靜態建構式,靜態欄位,靜態方法的類,并不會在專案啟動時就實體化,涉及到物件創建,記憶體分配,需要好好思考),再有,自己的一些術語上可能不太規范,可能導致大家,
總結一下:
一,關于饑餓模式和懶加載模式的區別的標準答案:“饑餓模式是在類加載時創建實體,而懶加載模式是在Instance被呼叫時創建實體,”
二,關于單例模式的規范:單例模式的所有操作,都應該通過Instance呼叫實作(對外不能提供其他靜態欄位或靜態方法),這個規范是我自己定的,大家見仁見智,
三,關于效率問題:如果是符合上述規范的,那么就不存在"過早地創建實體,從而降低記憶體的使用效率"的問題(真想不到什么場景下會提前創建一個單例而不使用),
四,關于volatile:好幾個人提到了volatile,從微軟檔案上我們可以得知,這個關鍵字標記一個可能被多個執行緒同時修改的欄位,當這個欄位值被修改后,其他執行緒中的欄位值也都會即時發生變化,
這段檔案看的人一頭霧水,直到有人在評論中提出“指令重排”,頓時豁然開朗,非常感謝,
指令重排是由于編譯器,運行時,或者硬體,為提高代碼運行效率,會在保證最終執行結果不變的情況下,改變代碼的執行順序,
這是一種優化方案,在單執行緒下沒有問題,但在多執行緒的情況下,由于不同執行緒內的代碼執行順序改變,可能產生錯誤,
怎么證明指令重排確實發生了呢,這篇文章中給了示例,大家可以試一下,加深印象,https://developer.aliyun.com/article/765749
關于指令重排和volatile,這篇文章解釋的很好,https://www.sohu.com/a/211287207_684445,大家可以學習一下,
最后,用一句很勵志的話來結尾:我希望一個人在公司中被認可,被領導器重,是因為自己的技術和能力;而不是要靠阿諛奉承,溜須拍馬得來的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/134792.html
標籤:.NET技术
