程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 【單例模式】Singleton pattern,singletonpattern

【單例模式】Singleton pattern,singletonpattern

編輯:C#入門知識

【單例模式】Singleton pattern,singletonpattern


前言:有很多時候,在一個生命周期中我們只要一個對象就可以了,比如:線程池,緩存,對話框,日志,顯卡驅動等等。如果造出多個實例,就會導致許多問題產生,例如:程序的行為異常、資源使用過量,或者說不一致的結果。

public class Singleton { private static Singleton instance; private Object _synchronizedObj = new Object(); //private constructor private Singleton() { } public Singleton GetInstance { get { if (instance == null) lock (_synchronizedObj) { if (instance == null) instance = new Singleton(); } return instance; } } } View Code

 

這裡用到了Lock, 我看過大部分代理都沒有使用到這裡,但是如果不用上,在有多線程的項目中就會出現問題。

我用了兩次NULL的判斷,最外層說因為如果你第一次創建好了就不需要去進行LOCK,這裡會有消耗。裡面那一個NULL判斷是因為如果你有多個線程一起來創建,都通過第一層NULL限制,進入了LOCK等待,當第一個對象創建完,放開了LOCK,第二進去以後,如果不加判斷又會創建一次。

 

有人和我說這樣會不會更優雅,因為不用一個成員變量Object.

1 public class Singleton 2 { 3 private static Singleton instance; 4 5 //private constructor 6 private Singleton() { } 7 8 9 public Singleton GetInstance 10 { 11 get 12 { 13 if (instance == null) 14 lock (typeof(Singleton)) //here 15 { 16 if (instance == null) 17 instance = new Singleton(); 18 } 19 return instance; 20 } 21 } 22 } View Code


這裡不得不提及 同步索引塊(Sync block index),這個東西被關注的特別少,既然說學習CLR,這個東西可是叱咤風雲(不過大部分的時候,你不會用而已啦).

Sync block index 初始化和過程

  

當CLR初始化的時候,CLR會初始化一個SyncBlock的數組,當一個線程到達Monitor.Enter方法時,該線程會檢查該方法接受的參數的同步塊索引,默認情況下對象的同步塊索引是一 個負數
(實際上並不是負數,我這裡只是為了敘說方便),那麼表明該對象並沒有一個關聯的同步塊,CLR就會在全局的SyncBlock數組裡找到一個空閒的項,然後將數組的索引賦值給該對象的同步塊索
引,當Monitor.Enter執行時,它會設置SyncBlock裡的內容,標識出已經有一個線程占用了,當另外一個線 程進入時,它就會檢查SyncBlock的內容,發現已經有一個線程占用了,該線程就
會等待,當Monitor.Exit執行時,占用的線程就會釋放SyncBlock,其他的線程可以進入操作了。

注:參考博客園另一篇文章:http://www.cnblogs.com/qianyz/archive/2011/10/26/2224925.html(若要了解更多的SyncBlockIndex的用途和原理,可以看這篇)

 所以對於上面的代碼:

  typeof(Singleton)返回一個Type對象,如果用這個,會返回相同TYPE對象。我們在這裡用lock(typeof(Singleton))鎖定了,相當於鎖定返回的TYPE對象。OK,當我們在其他在用lock(typeof(Singleton))的時候,又鎖了這個對象...2個地方鎖了用了同一個對象,結果不該等待的地方也在等待了。 所以我們這裡用了私有的Object對象來充當關聯進索引塊的對象,無論外面這麼鎖,都鎖不住者裡東西。

  


你熟悉的設計模式有什?寫出單例模式的實現代碼

一共23種設計模式!

引用《軟件秘笈-設計模式那點事》書籍:

按照目的來分,設計模式可以分為創建型模式、結構型模式和行為型模式。
創建型模式用來處理對象的創建過程;結構型模式用來處理類或者對象的組合;行為型模式用來對類或對象怎樣交互和怎樣分配職責進行描述。

創建型模式用來處理對象的創建過程,主要包含以下5種設計模式:
 工廠方法模式(Factory Method Pattern)
 抽象工廠模式(Abstract Factory Pattern)
 建造者模式(Builder Pattern)
 原型模式(Prototype Pattern)
 單例模式(Singleton Pattern)

結構型模式用來處理類或者對象的組合,主要包含以下7種設計模式:
 適配器模式(Adapter Pattern)
 橋接模式(Bridge Pattern)
 組合模式(Composite Pattern)
 裝飾者模式(Decorator Pattern)
 外觀模式(Facade Pattern)
 享元模式(Flyweight Pattern)
 代理模式(Proxy Pattern)

行為型模式用來對類或對象怎樣交互和怎樣分配職責進行描述,主要包含以下11種設計模式:
 責任鏈模式(Chain of Responsibility Pattern)
 命令模式(Command Pattern)
 解釋器模式(Interpreter Pattern)
 迭代器模式(Iterator Pattern)
 中介者模式(Mediator Pattern)
 備忘錄模式(Memento Pattern)
 觀察者模式(Observer Pattern)
 狀態模式(State Pattern)
 策略模式(Strategy Pattern)
 模板方法模式(Template Method Pattern)
 訪問者模式(Visitor Pattern)

單例模式實現1:
public class Singleton {
// 類共享實例對象
private static Singleton singleton = null;
// 私有構造方法
private Singleton() {
System.out.println("-- this is Singleton!!!");
}
// 獲得單例方法
public synchronized static Singleton getInstance() {
// 判斷 共享對象是否為null ,如何為null則new一個新對象
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}

單例模式實現2:
public class Singleton {
// 類共享實例對象 實例化
private s......余下全文>>
 

Java單例模式怎使用?

public class Singleton {
private static Singleton sin=new Singleton();
private Singleton(){

}
public static Singleton getInstance(){
return sin;
}
}
比如說Class、Runtime類都是單列設計模式。。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved