設計模式之單例模式

2022-09-09 00:09:20 字數 1795 閱讀 7931

​ 所謂單例模式,就是採取一定的方法使得系統中只存在某個類的乙個例項,並且該類只提供乙個獲取物件例項的方法(靜態方法);比如hibernate的sessionfactory

步驟:1. 執行緒不安全

class singleton

//2.類內部定義物件

private static singleton instance;

//3. 提供乙個公共的方法獲取物件

public static singleton getinstance()

return instance;}}

該方法只能在單執行緒下執行,多執行緒下有可能多個執行緒同時進入到 if 模組,以至於建立出多個例項,實際開發中不能使用這種方法

2.執行緒安全,同步方法

getinstance()方法中加上同步**關鍵字synchronized來解決執行緒問題

public static synchronized singleton getinstance()

return instance;

}

效率過低,我們在建立物件例項的時候才需要同步,而這樣的**我們在之後的每次獲取例項都會進行一次同步,方法進行同步的效率太低了

volatile可以使共享變數一旦修改就重新整理到記憶體裡去,在getinstance方法中,通過synchronized同步來使得執行緒安全,當多個執行緒進入外層 if 時,會受到synchronized關鍵字作用,單個進入到內層 if 中,當instance被建立後,由於volatile的作用會立刻重新整理到記憶體,等待的執行緒就會在內層 if 中判斷false,即保證了單個例項建立,再後來的執行緒在外層 if 就false了,也解決了效率問題

class singleton

//2.類內部定義物件

private static volatile singleton instance; // volatile可以使共享變數一旦修改就重新整理到記憶體裡去

//3. 提供乙個公共的方法獲取物件

public static singleton getinstance()}}

return instance;

}

}

開發中可以使用

jvm在類載入的時候是執行緒安全的,並且類載入的時候,其靜態內部類不會被載入,所以我們可以利用這一點來達到執行緒安全和lazy loading的效果

class singleton

//2.私有化構造器

private singleton(){}

//3. 提供乙個公共的方法獲取物件,呼叫該方法時,內部類第一次被載入,建立物件例項

public static singleton getinstance()

}

開發中推薦使用

借助jdk1.5中新增的列舉來實現單例模式。不僅可以避免多執行緒同步問題,而且還能防止反序列化重新建立性的物件

enum singleton

}//可以直接呼叫獲取

singleton instance = singleton.instance;

//列舉中的方法也可以直接呼叫

instance.play();

開發中推薦使用

分析runtime原始碼中使用的單例模式

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...