标签:远程 lazy img 线程同步 记录 图片 行操作 idt readonly
单例模式的概念:
单例模式保证一个类只有一个实例,并且提供一个访问它的全局访问点;
单例模式存在的意义:
单例模式用于当我们系统中的某个对象只需要一个实例的情况;例如PC远程桌面只能有一个人进行操作一个用户;
实现思路:
(1)、需要确保一个类只有一个实例
创建公有类、私有构造函数实现;
public class Singleton
{
//私有变量来记录Singleton的唯一实例
private static Singleton singleton;
//私有构造函数
private Singleton()
{
}
}
(2)、提供一个访问他的全局访问点
(2.1)、加锁
(2.2)、双重锁定
//定义共有方法来提供该类的唯一全局访问点
public static Singleton GetInstance()
{
/*当第一个线程运行到这里时,此时会对locker对象“加锁”
* 当第二个线程运行该方法时,首先检测到locker对象为“加锁状态”,该线程就会挂
起等待第一个线程解锁
* lock语句运行完之后(即线程运行完之后)会对该对象解锁
* 双重锁定只需要一句判断就可以
* **/
if (singleton == null)
{
lock (locker)
{
//判断该实例是否存在,不存在则new一个新实例,否则返回已有实例
if (singleton == null)
{
singleton = new Singleton();
}
}
}
return singleton;
}
总结:
公有类、私有构造函数、全局访问点(判断、加锁、判断)
完整源码:
public class Singleton
{
//私有变量来记录Singleton的唯一实例
private static Singleton singleton;
//定义一个标识确保线程同步
private static readonly object locker = new object();
//私有构造函数
private Singleton()
{
}
/// <summary>
/// 定义共有方法来提供该类的唯一全局访问点
/// </summary>
/// <returns>实例化对象</returns>
public static Singleton GetInstance()
{
/*当第一个线程运行到这里时,此时会对locker对象“加锁”
* 当第二个线程运行该方法时,首先检测到locker对象为“加锁状态”,该线程就会挂起等待第一个线程解锁
* lock语句运行完之后(即线程运行完之后)会对该对象解锁
* 双重锁定只需要一句判断就可以
* **/
if (singleton == null)
{
lock (locker)
{
//判断该实例是否存在,不存在则new一个新实例,否则返回已有实例
if (singleton == null)
{
singleton = new Singleton();
}
}
}
return singleton;
}
}
测试:
OK,实现已经结束了,现在来测试下单例模式的效果;
首先在单例模式类中定义一个测试用的字符串
//测试单例模式效果
private string strTest;
public string StrTest { get => strTest; set => strTest = value; }
然后设计测试代码:
static void Main(string[] args)
{
Singleton singleton = Singleton.GetInstance();
singleton.StrTest = "test";
Console.WriteLine(singleton.StrTest);
TestSingleton();
}
private static void TestSingleton()
{
Singleton singleton = Singleton.GetInstance();
Console.WriteLine(singleton.StrTest);
}
按照非单例模式上列代码执行结果应该是先显示test,然后显示空串
测试代码:
static void Main(string[] args)
{
Test test = new Test();
test.StrTest = "test";
Console.WriteLine(test.StrTest);
TestSingleton();
}
private static void TestSingleton()
{
Test test = new Test();
Console.WriteLine(test.StrTest);
}
测试结果:

运行单例模式测试代码测试结果如下:

根据上面测试的结果可以知道,无论是重新多少次调用入口,它永远只会让你访问那一个实例!
标签:远程 lazy img 线程同步 记录 图片 行操作 idt readonly
原文地址:https://www.cnblogs.com/zhoulei0517/p/13266734.html