/// <summary> /// 單例模式的實現 /// </summary> public class Singleton { // 定義一個靜態變量來保存類的實例 private static Singleton uniqueInstance; // 定義私有構造函數,使外界不能建立該類實例 private Singleton() { } /// <summary> /// 定義公有方法提供一個全局訪問點,同時你也能夠定義公有屬性來提供全局訪問點 /// </summary> /// <returns></returns> public static Singleton GetInstance() { // 若是類的實例不存在則建立,不然直接返回 if (uniqueInstance == null) { uniqueInstance = new Singleton(); } return uniqueInstance; } }
/// <summary> /// 單例模式的實現 /// </summary> public class Singleton { // 定義一個靜態變量來保存類的實例 private static Singleton uniqueInstance; // 定義一個標識確保線程同步 private static readonly object locker = new object(); // 定義私有構造函數,使外界不能建立該類實例 private Singleton() { } /// <summary> /// 定義公有方法提供一個全局訪問點,同時你也能夠定義公有屬性來提供全局訪問點 /// </summary> /// <returns></returns> public static Singleton GetInstance() { // 當第一個線程運行到這裏時,此時會對locker對象 "加鎖", // 當第二個線程運行該方法時,首先檢測到locker對象爲"加鎖"狀態,該線程就會掛起等待第一個線程解鎖 // lock語句運行完以後(即線程運行完以後)會對該對象"解鎖" lock (locker) { // 若是類的實例不存在則建立,不然直接返回 if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } return uniqueInstance; } }
/// <summary> /// 單例模式的實現 /// </summary> public class Singleton { // 定義一個靜態變量來保存類的實例 private static Singleton uniqueInstance; // 定義一個標識確保線程同步 private static readonly object locker = new object(); // 定義私有構造函數,使外界不能建立該類實例 private Singleton() { } /// <summary> /// 定義公有方法提供一個全局訪問點,同時你也能夠定義公有屬性來提供全局訪問點 /// </summary> /// <returns></returns> public static Singleton GetInstance() { // 當第一個線程運行到這裏時,此時會對locker對象 "加鎖", // 當第二個線程運行該方法時,首先檢測到locker對象爲"加鎖"狀態,該線程就會掛起等待第一個線程解鎖 // lock語句運行完以後(即線程運行完以後)會對該對象"解鎖" // 雙重鎖定只須要一句判斷就能夠了 if (uniqueInstance == null) { lock (locker) { // 若是類的實例不存在則建立,不然直接返回 if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } }
簡單模擬網站計數功能html
public class Singleton { private static Singleton instance;//靜態實例 private static readonly object locker = new object();//靜態鎖 public int count = 1; private Singleton() {//構造函數 while (true) { Console.ReadKey(); count += 1; Console.WriteLine(count.ToString()); } } public static Singleton GetInstance()//方法,方法中去實例化類. { if (instance == null) { lock(locker) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
在某個時候我只須要一個線程去處理事務,不想有多個實例時。例如咱們創建一個數據庫存取的管理類。類中有許多的方法。sql
public class DBManager { private static DBManager uniqueInstance;//定義一個靜態變量來保存類的實例 private static readonly object locker = new object();//定義一個線程鎖 private static SQLiteHelp sqliteHelper;//實例化一個數據庫鏈接 #region 全局訪問點 private DBManager() { string dbPath = Application.StartupPath + "\\Data.thl"; sqliteHelper = new SQLiteHelp("data source=" + dbPath + ";Pooling=true;FailIfMissing=false"); } /// <summary> /// 全局訪問點 /// </summary> /// <returns></returns> public static DBManager GetInstance() { if (uniqueInstance == null) { lock (locker) { if (uniqueInstance == null) { uniqueInstance = new DBManager(); } } } return uniqueInstance; } #endregion #region 文件列表操做 /// <summary> /// 插入路徑 /// </summary> /// <param name="path">路徑</param> /// <returns></returns> public bool InsertFilePath(string path) { string sql = "insert into RunInfoList (FilePath,Status) values ('" + path + "','中止')"; var affectedCount = sqliteHelper.ExecuteNonQuery(sql); if (affectedCount == 1) { return true; } else { return false; } } /// <summary> /// 插入路徑 /// </summary> /// <param name="serverId">遊服ID</param> /// <param name="path">路徑</param> /// <returns></returns> public bool InsertFilePath(int serverId,string path) { string sql = "insert into RunInfoList (ServerId,FilePath,Status) values ('"+serverId+"','" + path + "','中止')"; var affectedCount = sqliteHelper.ExecuteNonQuery(sql); if (affectedCount == 1) { return true; } else { return false; } } /// <summary> /// 刪除 /// </summary> /// <param name="path">路徑</param> /// <returns></returns> public bool DeleteFilePath(string path) { string sql = "delete from RunInfoList where FilePath = '" + path + "'"; var affectedCount = sqliteHelper.ExecuteNonQuery(sql); if (affectedCount == 1) { return true; } else { return false; } } /// <summary> /// 更新最後的備份時間 /// </summary> /// <param name="path">路徑</param> /// <returns></returns> public bool UpdateTime(string path) { string sql = "update RunInfoList set LastBackupTime=datetime('now') where FilePath = '" + path + "'"; var affectedCount = sqliteHelper.ExecuteNonQuery(sql); if (affectedCount == 1) { return true; } else { return false; } } /// <summary> /// 獲取文件列表 /// </summary> /// <returns></returns> public List<FileListInfo> GetFileList() { string sql = "select * from RunInfoList"; var reader = sqliteHelper.ReturnDataReader(sql); List<FileListInfo> fileList = new List<FileListInfo>(); while (reader.Read()) { FileListInfo data = new FileListInfo(); if (!Convert.IsDBNull(reader["ServerId"])) { data.ServerId = Convert.ToInt32(reader["ServerId"]); } if (!Convert.IsDBNull(reader["FilePath"])) { data.FilePath = reader["FilePath"].ToString(); } if (!Convert.IsDBNull(reader["Status"])) { data.Status = reader["Status"].ToString(); } if (!Convert.IsDBNull(reader["LastBackupTime"])) { data.LastBackTime = reader["LastBackupTime"].ToString(); } fileList.Add(data); } return fileList; } /// <summary> /// 更新ServerId /// </summary> /// <param name="path"></param> /// <returns></returns> public bool UpdateServerId(string path,string serverid) { string sql = "update RunInfoList set ServerId='"+serverid+"' where FilePath = '" + path + "'"; var affectedCount = sqliteHelper.ExecuteNonQuery(sql); if (affectedCount == 1) { return true; } else { return false; } } #endregion }
說了單例模式的一些概念和代碼,重要的是咱們要怎麼應用在實際的開發中?如下是我在博客園找到的關於單例的運用場景。數據庫