單例設計模式singleton

2022-03-12 11:00:21 字數 1747 閱讀 2470

單例設計模式作為最簡單,最常用的設計模式。一般是這兩中寫法,這兩種寫法教科書所謂的標準寫法,但是實際上存在不少問題。後面介紹標準寫法,以規避這些問題。

/**

* 問題在於,當多執行緒工作的時候,如果有多個執行緒同時執行到if (instance ==

* null),都判斷為null,那麼兩個執行緒就各自會建立乙個例項——這樣一來,就不是單例了。

*/class singleton ;

private static singleton s;

public static singleton getinstance()

return s;

}}

2.惡漢式

class singleton 

private static singleton singleton = new singleton();

public static singleton getinstance()

}

(規避執行緒安全問題)加上 synchronized修飾方法即可

class singleton ;

private static singleton s;

public static synchronized singleton getinstance()

return s;

}}

1.第乙個if 只有instance為null的時候,才進入synchronized的**段——大大減少了機率。

2.第二個if 是為了防止可能出現多個例項的情況。

class doublecheck 

private static doublecheck dcheck;

public static doublecheck getinstance()

}} return dcheck;

}}

不知道原子操作,與指令重排的建議複習下

class doublecheck2 

private static volatile doublecheck2 scheck;

public static doublecheck2 getinstance()

}} return scheck;

}}

說白了,有classloder裝載 就是一開始就建立類

/*

* 缺點也就只是餓漢式單例本身的缺點所在了——由於instance的初始化是在類載入時進行的,而類的載入是由classloader來做的,

* 所以開發者本來對於它初始化的時機就很難去準確把握:

* * 可能由於初始化的太早,造成資源的浪費 如果初始化本身依賴於一些其他資料,那麼也就很難保證其他資料會在它初始化之前準備好。

*/class singleton

private static final singleton singleton = new singleton();

public static singleton getinstance()

}

class innersingleton 

private static class singletonholder

public static innersingleton getinstance()

}

設計模式 單例Singleton

定義 確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。使用場景 確保某個類有且只有乙個物件的場景,例如建立乙個物件需要消耗的資源過多,如要訪問 io 和資料庫等資源。以earth為例,簡單的單例模式可以寫成如下形式。public class earth public earth g...

單例設計模式(singleton)

單例設計模式的概念 作為物件建立模式,檔裡模式確保某個類只有乙個例項物件,而且自行建立例項並向整個系統提供這個例項。這個類稱為單例類!單例模式的提點 1,單例類只能有乙個例項 2,單例類的唯一例項必須自己建立 3,單例類必須向系統提供這個唯一的例項 餓漢單例類 public class eagers...

設計模式 單例Singleton

若是你希望自己寫的程式中的某個類只能有乙個相對應的例項,那麼這個時候就要用到單例模式了。單例模式是一種非常常見的設計模式,實現方法有好幾種,下面將一一介紹 1.懶漢式 public class singleton public static singleton getinstance return ...