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

推荐订阅源

云风的 BLOG
云风的 BLOG
IT之家
IT之家
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
博客园 - 司徒正美
美团技术团队
Last Week in AI
Last Week in AI
月光博客
月光博客
博客园 - 叶小钗
MongoDB | Blog
MongoDB | Blog
U
Unit 42
T
Tailwind CSS Blog
GbyAI
GbyAI
T
The Blog of Author Tim Ferriss
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
H
Hackread – Cybersecurity News, Data Breaches, AI and More
酷 壳 – CoolShell
酷 壳 – CoolShell
Google DeepMind News
Google DeepMind News
H
Help Net Security
Hugging Face - Blog
Hugging Face - Blog
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
Netflix TechBlog - Medium
B
Blog RSS Feed
大猫的无限游戏
大猫的无限游戏
aimingoo的专栏
aimingoo的专栏
A
About on SuperTechFans
Y
Y Combinator Blog
罗磊的独立博客
D
DataBreaches.Net
有赞技术团队
有赞技术团队
MyScale Blog
MyScale Blog
博客园_首页
博客园 - 三生石上(FineUI控件)
G
Google Developers Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
博客园 - 【当耐特】
Engineering at Meta
Engineering at Meta
博客园 - Franky
M
MIT News - Artificial intelligence
B
Blog
The Cloudflare Blog
Apple Machine Learning Research
Apple Machine Learning Research
I
InfoQ
S
SegmentFault 最新的问题
F
Fortinet All Blogs
阮一峰的网络日志
阮一峰的网络日志
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog

博客园 - -Enchant

Linux上搭建Asp.net MVC3环境(CentOS + Nginx + Mono) 系统框架整理 Extjs prompt 显示密码框 Python网页抓取、模拟登录 单点登录(SSO)的一点思考 Jquery以JSON方式调用WebService WCF初探 关于抓取百度搜索内容 iPhone开发环境搭建(备忘) SMTP/POP3命令简介(转) C/S模式下 简单的定时任务功能 Asp.net MVC2学习笔记索引 Oracle 调优 Oracle常见错误 @OutputCache指令参数 关于ACL权限控制【ASP.NET MVC2】 c#递归生成XML ASP.NET MVC2 Ajax返回JSON 引用类型的对象复制(浅复制和深复制)
《单例模式》你需要注意的问题
-Enchant · 2011-08-26 · via 博客园 - -Enchant

单例模式大家都很熟悉,但是使用过程中,稍微不注意就会出现大问题。

单例模式:该类在整个系统生命周期中有且只有一个实例。

单例的创建:

注意问题:

  1. 构造函数 私有化 :保证 实例化该类通过统一的接口
  2. 提供一个统一的接口获取类的实例
  3. 保证线程同步

 例如:

public class CommonQuery
{
private CommonQuery() { }object aLocker = new object();
        
static readonly CommonQuery _cmQuery = null;public static CommonQuery GetCommonQuery()
        {

          if(_cmQuery!=null)

           {return _cmQuery;}
      lock(aLocker)
      {
        if(_cmQuery==null)
        {
          _cmQuery = new CommonQuery();
        }
      
      }

      return _cmQuery;

        }
}

单例中应该避免的问题:

  1. 避免无限递归调用
  2. 尽量少将数据或其他类的实例保存到该单例类中的全局变量中(如果有必要除外)

以上2点问题主要针对内存的问题,因为单例是在整个系统生命周期中都一直存在,如果有大量信息被单例保存,可想而知,我们的内存伤不起啊,

导致的结果就是 内存溢出!

场景:

多任务定时采集某网站数据该需求 核心我一般这么设计:至少2个类
  1. CommonQuery:单例,负责 采集任务初始化、线程控制、具体采集任务调度、采集结果/错误等后续处理、通知前端UI
  2. WebWorker:非单例,负责具体采集任务,执行结果将反馈给CommonQuery

 核心序列图:

 

核心类图:

 

基本上核心 就是上面2个类,

执行流程是:在CommonQuery中的 Start()方法中,生成N个(根据多线程需要)webWorker对象,执行具体任务,当该任务执行完成或者出错以后,便通过事件EFinished或者EError来

通知CommonQuery,此时CommonQuery 根据实际情况来处理是继续新建任务来执行,还是判断整个任务结束,通知前台UI。(整个过程采用多线程异步)

 注意点:

  1. 在CommonQuery中 不需要保存任何webworker实例!应该在Start()方法里面去new WebWorker对象
  2. 在WebWorker的EFinished/EError事件处理中(在CommonQuery中处理),千万别调用新的一轮采集任务的开始!(此时造成无限递归!灰常危险!!)
  3. 检查CommonQuery,尽量减少将变量保存下来

这几点主要针对内存的建议,一般这种采集任务执行时间都较长,有时候需要连续几天不停的采集,此时如果设计的有问题,出现以上3中情况,呵呵,您的内存伤不起啊。。。

 C#技术交流: 64913828