單例模式:採用一定的方法,使得軟體執行中,對於某個類只能存在乙個例項物件,並且該類只能提供乙個取得例項的方法。
分類:
實現思路:
想要實現單例,即不能讓外部隨意的去例項化物件。所以需要構造器私有
既然不允許外部去建立了,所以需要在類的內部建立物件
外部需要使用物件,所以需要對外提供乙個獲取例項的方法
根據物件建立的時機,可以分為餓漢式和懶漢式。餓漢式,即在類載入的時候立即建立例項,根據所學知識我們可以很快想到要使用static
關鍵字將屬性和類相關聯。以下提供兩種書寫方式供參考。
特點
class singleton01
//內部建立物件
private final static singleton01 instance = new singleton01();
//提供給外部建立例項的靜態方法
public static singleton01 getinstance()
}
class singleton02
//內部建立物件
private static singleton02 instance;
static
//提供給外部建立例項的靜態方法
public static singleton02 getinstance()
}
這種方式和靜態常量的實現方式邏輯和優缺點是一樣的,只是寫法不同。
懶漢式,即在類載入時並不例項化物件,等到使用物件例項的時候才去例項化,也被稱為懶載入效果。這樣做的好處可以節約資源,減少浪費,只有需要的時候採取建立,不需要就不會例項化。
class singleton01
// 定義靜態變數,例項化留在獲取例項的getinstance方法,起到懶載入效果
private static singleton01 instance;
public static singleton01 getinstance()
return instance;
}}
問題:在多執行緒情況下,假設類還未第一次例項化,此時兩個程序同時執行到了if(instance==null)
,而未來得及往下執行時,此時兩者校驗都成立,都會執行例項化操作,將有可能出現建立多個例項的問題。
class singleton02
//使用synchronized關鍵字來實現執行緒安全
public static synchronized singleton02 getinstance()
return instance;
}}
這樣的方式可以起到執行緒安全的效果,但是每個執行緒都需要等待鎖,所以又會存在效率低的問題,於是有人想到了將鎖的範圍縮小到方法的內部,使用同步**塊的方式
這樣的方式好不好呢?先看**
class singleton03
public static singleton03 getinstance()
}return instance;
}}
這樣鎖的範圍是變小了,但是還會存在多個執行緒同時判斷到if (instance == null)
,即使在後面加上鎖,依舊會在後續建立例項,只是延遲了一點而已,所以這種寫法不可取
為了能夠實現懶載入的效果,同時兼顧效率,於是出現了這種寫法
class singleton01
//雙重檢查,解決執行緒同步問題,又保證效率
public static singleton01 getinstance()}}
return instance;
}}
使用雙重檢查,第一次檢查提公升效率,第二次檢查保證執行緒安全,簡直美滋滋
利用靜態內部類在被呼叫時才會載入,即存在懶載入效果,所以也可以這樣寫
class singleton02
/*靜態內部類在外部類裝載的時候不會馬上執行,起到懶載入作用。
類的靜態屬性只有在第一次使用的時候才會載入,jvm在類載入時是執行緒安全的
*/private static class singletoninstance
public static singleton02 getinstance()
}
列舉方式是最簡單的寫法,也是被很多人推崇的寫法
enum singleton03
簡單明瞭...
使用單例模式,可以使乙個類只存在乙個例項物件,從而節省了系統資源。
23種設計模式 單例模式
某些情況,如 執行緒池,乙個專案中匯流排程數量以及生命週期,可能需要統一控制 如果執行緒池自身可建立多個例項,那麼就無法統一控制,此時,只要能控制線程池物件的數量為乙個,那麼就可以實現統一控制的目標 注意 現實中真正使用純的單例模式並不多 如 spring bean 通過配置來決定是否使用單例 執行...
單例模式(23種設計模式)
單例模式 餓漢模式 class singletondemo public static singletondemo gets 懶漢模式 class singletondemo1 public static singletondemo1 gets return instance 單例模式,懶漢式,執行...
23種設計模式 單例模式
單例模式需要保證,構造方法一定是私有化的,並且類的全域性變數必須是靜態的,私有的 這樣才能有唯一的例項化途徑 錯誤 一 public class singleton public static singleton getinstance 上述方法,並沒有把類變數singleton設定為靜態的,這樣,...