咕泡-單例 singleton設計模式筆記

##查看代碼:https://gitee.com/jly521/singleton.gitgit

單例模式(Singleton)安全

  • 應用場景:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點
  • Spring 中的單例模式完成了後半句話,即提供了全局的訪問點BeanFactory
  • 但沒有從構造器級別去控制單例,這是由於Spring 管理的是是任意的Java 對象
  • Spring 下默認的Bean 均爲單例

  • 經常使用單例模式寫法:餓漢式、懶漢式、註冊式、序列化

餓漢模式網絡

  • 在類加載的時候就當即初始化,而且建立單例對象
  • 優勢:沒有加任何的鎖、執行效率比較高, //在用戶體驗上來講,比懶漢式更好
  • 缺點:類加載的時候就初始化,無論你用仍是不用,我都佔着空間 //浪費了內存,有可能佔着茅坑不拉屎
  • 絕對線程安全,在線程還沒出現之前就是實例化了,不可能存在訪問安全問題

懶漢模式性能

  • 在外部須要使用的時候才進行實例化

lazy1:線程

lazy2:3d

lazy3:對象

  • 特色:在外部類被調用的時候內部類纔會被加載
  • 內部類必定是要在方法調用以前初始化
  • 巧妙地避免了線程安全問題
  • 這種形式兼顧餓漢式的內存浪費,也兼顧synchronized性能問題
  • 完美地屏蔽了這兩個缺點
  • 史上最牛B的單例模式的實現方式

  • lazy3 在反射初始化時,不是線程安全的

序列化::blog

  • 反序列化時致使單例破壞

序列化內存

  • 就是說把內存中的狀態經過轉換成字節碼的形式
  • //從而轉換一個IO流,寫入到其餘地方(能夠是磁盤、網絡IO)
  • //內存中狀態給永久保存下來了

反序列化get

  • //講已經持久化的字節碼內容,轉換爲IO流
  • //經過IO流的讀取,進而將讀取的內容轉換爲Java對象
  • //在轉換過程當中會從新建立對象new

  • 實現 readResolve 方法能保證單例

註冊模式::

  • Spring中的作法,就是用這種註冊式單例

相關文章
相關標籤/搜索