/// <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 }
说了单例模式的一些概念和代码,重要的是咱们要怎么应用在实际的开发中?如下是我在博客园找到的关于单例的运用场景。数据库