惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
NISL@THU
NISL@THU
T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
Lohrmann on Cybersecurity
V
Visual Studio Blog
Cyberwarzone
Cyberwarzone
D
Docker
The Hacker News
The Hacker News
C
CERT Recently Published Vulnerability Notes
Vercel News
Vercel News
Project Zero
Project Zero
S
Schneier on Security
aimingoo的专栏
aimingoo的专栏
I
Intezer
腾讯CDC
M
MIT News - Artificial intelligence
Hugging Face - Blog
Hugging Face - Blog
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
AWS News Blog
AWS News Blog
GbyAI
GbyAI
MongoDB | Blog
MongoDB | Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
Vulnerabilities – Threatpost
G
Google Developers Blog
N
Netflix TechBlog - Medium
The Cloudflare Blog
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
A
Arctic Wolf
S
Securelist
酷 壳 – CoolShell
酷 壳 – CoolShell
Cisco Talos Blog
Cisco Talos Blog
Recent Announcements
Recent Announcements
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LINUX DO - 热门话题
T
Threatpost
Latest news
Latest news
Blog — PlanetScale
Blog — PlanetScale
Security Latest
Security Latest
Engineering at Meta
Engineering at Meta
大猫的无限游戏
大猫的无限游戏
H
Help Net Security
The GitHub Blog
The GitHub Blog
T
Tor Project blog
P
Proofpoint News Feed

博客园 - 无心之柳.NET

解决git 不同branch 下node_moudes不同步的问题 使用webpack打包ThinkPHP的资源文件 - 无心之柳.NET - 博客园 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(三) - 无心之柳.NET - 博客园 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(二) - 无心之柳.NET - 博客园 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(一) - 无心之柳.NET - 博客园 使用 Express 和 waterline 创建简单 Restful API 让淘宝链接在微信中分享,GO Chrome Version 19.0.1055.1 dev Flash Missing plug-in的修复 笔记本双屏系统的组建 再次解决,android 2.3运行凯立德问题 好消息,不用替换文件,凯立德能用了 新买的雷柏1800无线套装 新年好!!!!!!!!!!!!!!!!!!!!!!! 十五的月亮十六圆 开心网外挂开发之 三 开心网外挂开发之 XML序列化于反序列化 开心网外挂开发之 开篇 恩,我还在写代码 Ubuntu 安装Mono2.0和MonoDevelop的磨难记
开心网外挂开发之 Singleton 单件模式应用
无心之柳.NET · 2009-09-03 · via 博客园 - 无心之柳.NET

经过我们的努力,操作开心花园的各个底层功能我都开发出来了,我把所有的直接操作的功能都封装成一个KaiXinHelper类,通过这个类我们可以登录开心网,可以获得开心花园的所有信息,可以收获、播种、除草、除虫、浇水等等,把在所有对开心网直接的操作都集在这里了。

我们在写代码的时候发现,KaiXinHelper是我们整个程序的核心,所有的编程都是围绕它而来,登录模块要用它, 获取花园信息的模块要用它,对花园的所有操作也要用到它,但是它又是有状态的,就是除了登录以外的所有功能,都必须在确定登录好以后能能正常工作,所以KaiXinHelper就只能有一个实例,不然每次用其它功能而去login一下可不是什么好事,怎么能保证一个类只有一个实例呢?

我们知道所有的类实例化都是通过构造器来,当我们用new 来实例化对象的时候,会访问构造器里的代码来实例化,为了不让你码new 一个类,我们可以把构造器变为private,这样这个类就不能被new了,哪我们怎么实例化这个类呢, private下的代码在本类以外都不能实访问,我们可以让类里面实例化这个类吗、private下的代码在本类以内还果可以访问的

public static KaiXinHelper instance = null;
public static readonly object sysRoot=new object();

public static KaiXinHelper GetInstance()
{
    if (instance == null)
    {
        lock (sysRoot)
        {
            if(instance==null)
            {
                instance = new KaiXinHelper();
            }
        }
    }
    return instance;

}

这样我们在外面只要

this.khelper = KaiXinHelper.GetInstance();

这样我们就得到了这个类的实例。而且我们在访问GetInstance的时个判断过,instance是否为null,所以每次调用KaiXinHelper.GetInstance();都得到的是同一个实例,所以我们一次login以后,其状态一直是保存着的。

为什么我们还用到lock(sysRoot)这一行代码呢,

这是为了保证我们在多线程的情况下也保证KaiXinHelper只有一个实例。通过lock可以保证同一时间只有一个线程可以进入。

为什么要判断两次if(instance==null)

第一次的主要作用是因为lock的性能开销比较大,一但类实例化了以后,不用每次GetInstance()都要去访问lock的代码。

第二次的原因是,当类还有被实例化的时候,两个线程同时访问KaiXinHelper.GetInstance();这样都都可以通过第一次的if(instance==null) ,由于lock机制的存在,只有一个线程进入了以下代码, 另一个在一旁等着,第一个进入并执行了以下代码,

if(instance==null) {

instance = new KaiXinHelper();

}

这样第一个线程就创建了类的实例,等第二个线程再进入的时候,instance已经不为null,这样就防止了第二个线程再次创建类的实例。

这就是设计模式中的Singleton 单件(创建型模式) ,以上主要是个人的理解,希望不会误导人家,有不足之处还请批评指正