逐層高階的單例模式 完美!

2021-09-05 08:40:40 字數 882 閱讀 1246

這篇文章簡直不要太棒棒!這不是上次面平安科技實習面試官對我說的嗎?

最終版,具體的高階過程還是看原文吧,耐心看完,收穫多多。

public class single4 

public static single4 getinstance() }}

return instance;

}}

volatile禁止指令重排

主要在於singleton = new singleton()這句,這並非是乙個原子操作,事實上在 jvm 中這句話大概做了下面 3 件事情。

給 singleton 分配記憶體

呼叫 singleton 的建構函式來初始化成員變數,形成例項

將singleton物件指向分配的記憶體空間(執行完這步 singleton才是非 null 了)

但是在 jvm 的即時編譯器中存在指令重排序的優化。也就是說上面的第二步和第三步的順序是不能保證的,最終的執行順序可能是 1-2-3 也可能是 1-3-2。如果是後者,則在 3 執行完畢、2 未執行之前,被執行緒二搶占了,這時 instance 已經是非 null 了(但卻沒有初始化),所以執行緒二會直接返回 instance,然後使用,然後順理成章地報錯。

再稍微解釋一下,就是說,由於有乙個『instance已經不為null但是仍沒有完成初始化』的中間狀態,而這個時候,如果有其他執行緒剛好執行到第一層if (instance == null)這裡,這裡讀取到的instance已經不為null了,所以就直接把這個中間狀態的instance拿去用了,就會產生問題。

volatile雖然無法保證原子性,但是這裡由於用了synchronized進行同步,所以只能有乙個執行緒進行instance=new single4()這個操作,單執行緒下不會有別的執行緒進行干擾,所以是沒有問題的。

完美的單例模式

一 立即載入模式 餓漢模式 立即載入模式 餓漢模式 author lzn public class singleone 該方法保證在多執行緒中獲取的是同乙個物件 該方法缺點是不能有其他例項變數,因為getinstance 不是同步方法,會引起執行緒安全問題 return public static ...

單例模式 從不好到完美

單例模式的定義 確保某乙個類只有乙個例項,而且這個類可以自行例項化,並向整個系統提供這個例項。最最簡單的方法 餓漢模式 public class singleton 通過該方法獲取例項物件 public static singleton getsingleton 類中的其它方法盡量是static p...

高階函式,單例模式,AOP

1 將函式作為引數的函式的情況,值得一提是前面學習,學到的陣列的重排序方法sort 由於它會呼叫每個陣列項的tostring轉型方法,然後得到字串,確定公升序排列。即使陣列的每一項都是數值,比較的也是字串。因此,sort 方法可以接收乙個函式做引數,以便我們決定我們指定哪個位置在哪個位置的前面。fu...