面試:一個單例模式,足以把你秒成渣 (後記)

上一篇,一個簡單的單例模式,引發了很多人關注,確實沒想到。
首先,重申一下,這只是做爲本身的一個面試記錄,以及思考過程,主要是意識到本身以前在對待靜態變量上的一個錯誤(靜態類,或者帶靜態構造函數,靜態字段,靜態方法的類,並不會在項目啓動時就實例化,涉及到對象建立,內存分配,須要好好思考),再有,本身的一些術語上可能不太規範,可能致使你們。面試

總結一下:多線程

一,關於飢餓模式和懶加載模式的區別的標準答案「飢餓模式是在類加載時建立實例,而懶加載模式是在Instance被調用時建立實例。」函數

二,關於單例模式的規範:單例模式的全部操做,都應該經過Instance調用實現(對外不能提供其餘靜態字段或靜態方法)。這個規範是我本身定的,你們見仁見智。學習

三,關於效率問題:若是是符合上述規範的,那麼就不存在"過早地建立實例,從而下降內存的使用效率"的問題(真想不到什麼場景下會提早建立一個單例而不使用)。優化

四,關於volatile:好幾我的提到了volatile,從微軟文檔上咱們能夠得知,這個關鍵字標記一個可能被多個線程同時修改的字段,當這個字段值被修改後,其餘線程中的字段值也都會即時發生變化線程

這段文檔看的人一頭霧水,直到有人在評論中提出「指令重排」,頓時豁然開朗,很是感謝。對象

指令重排是因爲編譯器,運行時,或者硬件,爲提升代碼運行效率,會在保證最終執行結果不變的狀況下,改變代碼的執行順序。內存

這是一種優化方案,在單線程下沒有問題,但在多線程的狀況下,因爲不一樣線程內的代碼執行順序改變,可能產生錯誤。文檔

怎麼證實指令重排確實發生了呢,這篇文章中給了示例,你們能夠試一下,加深印象。https://developer.aliyun.com/article/765749get

關於指令重排和volatile,這篇文章解釋的很好,https://www.sohu.com/a/211287207_684445,你們能夠學習一下。

 

最後,用一句很勵志的話來結尾:我但願一我的在公司中被承認,被領導器重,是由於本身的技術和能力;而不是要靠阿諛奉承,溜鬚拍馬得來的。

相關文章
相關標籤/搜索