同事最近在編寫
cache server
的hash
演算法的時候,碰到了多核心
cpu
我們常常使用單例模式建立乙個可以被多執行緒共享的物件。傳統的方法是使用乙個
static
變數或者使用
double check+lock
手工處理單例。但是在進入了多核、
64位時代後,就不在那麼簡單了。尤其是
ia64
(安騰64
結構,伺服器
cpu,非筆記本和台式電腦的
cpu)的記憶體是弱記憶體模型(執行
memory reordering
的策略,
弱型別表示不會嚴格按照程式語句的執行順序執行)。
也就是說,即使使用了「多執行緒安全」的
static
變數和「
double lock
」模式,在
ia64
上仍然會出現建立兩次單例的情況。下面的語句仍然存在會建立兩次例項的可能:
public class singleton
public singleton instance}}
return instance;}}
} 解決辦法是使用改進的單例模式:
public class singleton
public singleton instance
} }
return instance; }
}如果想知道這麼做具體的技術細節,可以檢視相關的資料。否則請記住結論,因為單例是我們常常使用的設計模式,所以希望以後大家都使用上面的方式建立單例,可以避免遇到多核
cpu的問題。
C 11改進單例模式
我們在寫單例模式的時候會遇到乙個問題,就是多種型別的單例可能需要建立多個型別的單例,主要是因為建立單例物件的建構函式無法統一,各種型別的形參不盡相同,導致我們不容易做乙個所有型別都通過的單例。現在c 11幫助我們解決了這個問題,解決這個問題的關鍵靠的是c 11的可變模板引數,下面看 template...
單例設計模式核心實現
利用私有化構造方法的方式實現 該模式下single類中直接就例項化了物件如果沒有使用則會浪費記憶體空間 public class singleton class single static single instance newsingle public static single getinsta...
iOS 單例模式的使用
單例有什麼用?單例就是說在程式執行過程中邏輯上保持唯一性的物件。什麼時候會用到單例呢,幾乎所有工程都應該用到單例,因為不論任何程式在設計的時候都需要設計自己的model層,模型會有很多但是肯定需要乙個模型代表自己的程式本身,然後引用一大堆程式本身唯一的東西,比如程式當前的使用者資訊,當前的快取資訊,...