上一篇我们大致的了解了几种聊天室的行为模式

最简单明了的推模式 几乎不需要任何多余的语言来描述它的实现

这一篇我们看看如何实现拉模式更有效。

本图清晰的表现了"拉"模式聊天室的行为。

  • 并发多用户向数据池写数据
  • 并发多用户从数据池读书据
  • 数据最好以时间为顺序储存在集合中
  • 某时间向后的枚举查找将是最大的消耗。

聊天室进化 -女仆编年史

神秘的原始社会

仍然参考我们神奇朴素的Asp3聊天室

53     Application.lock
54         Application("show5")=Application("show4") '一条新信息驾到 第五条信息被淘汰
55         Application("show4")=Application("show3")
56         Application("show3")=Application("show2")
57         Application("show2")=Application("show")
58         Application("show")=NewMessage     '其他所有的信息向前移动一次给新的信息让个位置。
59     Application.UnLock
60     Response.Write Application("show5")
61     Response.Write Application("show4") '由于是postback 模式 必须输出历史n行数据
62     Response.Write Application("show3")
63     Response.Write Application("show2")
64     Response.Write Application("show")

从线程安全角度来说 本来 response.write应该也在 application .lock 块中  或者分开两个lock块.  但是这里由于response.write 在非cache模式下可能带来的时间延迟 作者煞费苦心的把他们从安全锁中移动出来.在实际运行中 很可能出现丢话或者重复发言的状况

application究竟 被人做了些什么? 没有边界  没有抽象包装的这个实现就好像原始共产主义 谁是谁的谁啊这都是!

私有制出现,奴隶社会 LOCK~ 这个女奴是我的~

翻译成c# 我们可以看到一个比较容易理解的逻辑 当然这个代码稍微有所修改 两个锁很明确 很完美的把数据和线程排起了队伍

Code Snippet

  1.        class Channel
  2.         {
  3.             Queue<string> MessageQ = new Queue<string>();
  4.             public void Say(string message) //写信息
  5.             {
  6.                 lock (MessageQ)
  7.                 {
  8.                     MessageQ.Enqueue(message);
  9.                     while (MessageQ.Count > 5)  // 删多余
  10.                     {
  11.                         MessageQ.Dequeue();
  12.                     }
  13.                 }
  14.             }
  15.             public string[] Listen() //\u-28781 ?出所有
  16.             {
  17.                 lock (MessageQ)
  18.                 {
  19.                     return MessageQ.ToArray();
  20.                 }
  21.             }
  22.          }

在aspx可能这样调用

Code Snippet

  1.             Channel cr = session["Chat"];
  2.             cr.Say(Request["text"]);
  3.             foreach (var s in cr.Listen())
  4.             {
  5.                 Response.write("<p>");
  6.                 Response.write(s);
  7.                 Response.write("</p>");
  8.             }

看起来圆满完成任务 但是里面充满了暧昧

类似事务 或者访问非托管资源 在访问线程临界资源的时候有个原则

你尽可能的晚锁 尽可能的早释放,

看看刚刚做了些什么

Oh My God

我们可怜的Channel阿  他被全程锁定。好像一个被老爷少爷轮流调教的女奴啊,真让我等正人君子心潮澎湃~~  啊不对  是于心不忍。

由于每个调教者在调教前声明:这个女奴是“我雷瓦Mono”我的东西! 所以在调教者声明 这个女仆“亚没漏”不要了之前 谁也不许碰!

LOCK LOCK~

这才是两个主人并发访问  就已经造成了这么多等待,如果是100主人个并发调教,那得是多么壮观的队伍!

我们的服务程序如果按照这个效率编写 恐怕cpu占用25%的时候就会崩溃---线程队列的极限是多少?  按照Jeffery Richard 的话说 你提出这个问题的时候 就已经Very Very Wrong鸟。

换句话说,不要挑战爷们的耐性,后果很严重

社会要进步 人民要革命  封建时代来临

我们不能满足这样的性能

老爷调教女奴的时候少爷不观摩 这我们理解,(写的时候加lock防止别的线程读)

少爷和女仆喝茶的时候  老爷不能乱入开始餐厅调教,这我们也接受 (读的时候加lock防止别的线程写)

但是少爷们找女奴喝茶,没有道理不可以一起开茶话会吧!

从某种意义上,只要集合元素不变化的话, Queue对象是支持安全的并发读的,为什么几个线程都在读取的状况下,我们还要继续上锁彼此排斥对方呢? 我们只是纯粹对女仆有爱,没什么不可以光明正大的吧!

把锁从完全锁变成读写锁,能够有效的减少很多不需要的等待。——  我们可以把喝茶的队伍缩短!

Code Snippet
  1. class ChannelReadWriteLock
  2. {
  3. Queue<string> MessageQ = new Queue<string>();
  4. System.Threading.ReaderWriterLockSlim _lock = new System.Threading.ReaderWriterLockSlim();
  5. public void Say(string message) //写信息
  6. {
  7. _lock.EnterWriteLock();
  8. MessageQ.Enqueue(message);
  9. while (MessageQ.Count > 5)  // 删多余
  10. {
  11. MessageQ.Dequeue();
  12. }
  13. _lock.ExitWriteLock ();
  14. }
  15. public string[] Listen() //   \u-29701 ?所有
  16. {
  17. _lock.EnterReadLock ();
  18. var ary= MessageQ.ToArray();
  19. _lock.ExitReadLock();
  20. return ary;
  21. }
  22. \

这是女仆界的胜利 她不再是一个人(的人) 而是可以和人socal的普通人了  虽然还在封建家长制的阴影下,仍然是被剥削被蹂躏的底层民众,但是她已经具有了比以前更大的自由!

先写到这里看看和谐底限 敬请期待   女仆编年史2

转载于:https://www.cnblogs.com/waynebaby/archive/2009/08/21/1551761.html

游戏大厅 从基础开始(6)--绕回来细说聊天室(中)之女仆编年史1相关推荐

  1. 游戏大厅 从基础开始(7)--绕回来细说聊天室(中间偏下)之女仆编年史2

    老少爷们儿反击战 上一篇中 我们的女仆终于可以做一些像阳光下其他人一样的事情了,少爷们可以和女仆酱一起参加下午茶~ 难得的上流社会啊 这是永远1v1被人私有的女奴 和 喝茶时被人共有的女仆酱最明显的差 ...

  2. 游戏大厅 从基础开始(4)-通过L2X用配置文件反射组装程序(VB only)

    游戏大厅 从基础开始(4)-通过L2X用配置文件反射组装程序(VB only) 很久没更新了.前一阵工作比较充实(就是比较劳累拉~),加上向老赵学习努力瘦身,精神愈发痛苦,难免就懒惰下来.通用倒了,项 ...

  3. 游戏大厅 从基础开始(3)——最吸引眼球的部分 客户端与服务器的连接

    游戏大厅 从基础开始(3) --最吸引眼球的部分 客户端与服务器的连接 看了上篇随笔的回复 发现大家都很关心如何实现连接. 但是本节可能不会涉及到数据连接的具体实现. (补充: tcp实现封装已经完成 ...

  4. 视频教程-Java基础中国象棋和网络聊天室Swing开发-Java

    Java基础中国象棋和网络聊天室Swing开发 IT行业资深从业者,7年资深Java高级开发,Java架构师.曾就职银行.电信等行业多家上市公司.担任项目负责人,软件架构师.有丰富的高并发.分布式系统 ...

  5. 校园圈子系统-游戏陪玩系统+派单+社交+多人聊天室-源码部署-APP小程序H5

    陪玩+语音房系统的发展前景 近年来,陪玩+语音房系统成为了广大游戏玩家的热门话题这种系统通过提供线上游戏陪玩的服务使得玩家可以在虚拟世界中找到真正的伙伴,进行愉快的游戏体验. 与此同时,陪玩+语音房系 ...

  6. [游戏服务器]第一章:多人聊天室-服务端

    游戏服务器 多人房间 高并发 低延时 数据可靠 ... 那么怎么去实现这些功能呢,下面我将会带着大家一起去探寻游戏服务器的奥秘 我不是巨人,我只是站在巨人的肩膀上 我将会分城多个章节去研究游戏服务器的 ...

  7. 原创 回归前端学习第21天-实现俄罗斯方块小游戏3(深入了解Websocket~优化简易聊天室)

    对昨天的简易聊天室进行优化 增加一个mes对象,将传送的数据放在对象里 增加一个mes对象,将传送的数据放在对象里 wsServer.js中替换代码 broadcast(conn.nickname + ...

  8. 大学Java基础课程设计——网络聊天室

    不登高山,不知天之高也:不临深溪,不知地之厚也. | @Author:TTODS 目录 项目简介 系统设计与实现 聊天室系统的总体设计 服务器端功能设计 客户端功能设计 数据包 用户操作处理流程 客户 ...

  9. java如何开发游戏大厅_java仿qq游戏大厅的设计与实现

    摘要:由于生活节奏的越来越快,人们越来越少的外出游玩.现在的人们为了生活,为了工作,为了家庭无时无刻不在紧张的环境中度过.而一些简单的小游戏则成为了人们放松的主要方式,本文用java语言开发了客户端/ ...

最新文章

  1. postman 接口测试工具介绍
  2. php中sql where,sql?where
  3. Android模拟器慢的解决办法
  4. 第五百一十八天 how can I 坚持
  5. kafka多个消费者消费一个topic_kafka:一文读懂消费者背后的那点quot;猫腻quot;
  6. Query Generation Module-NTU用多样性的query生成,涨点基于文本的实例分割(已开源)...
  7. CDays-3 习题二 (字典及文件读取练习)及相关内容解析。Python 基础教程
  8. 怎样学好python编程-3个月学好Python有多简单?
  9. 计算机二级黑板板书书写,清华老师们的板书惊艳朋友圈!8个板书技巧让黑板亮起来!...
  10. Thinkpad8在Windows10下假关机的解决办法
  11. k_fold_cv函数——bartMachine包内函数详解
  12. 中长焦投影仪买哪款好,当贝X3高流明热销你值得看
  13. 博世中国创新软件开发中心 BCSC
  14. 【全局路径规划】A*算法 A* Search Algorithm
  15. 加拿大要把AI带上飞机,他们都准备干什么?
  16. JavaScript---网络编程(2)-函数与数组
  17. STM32 Tips:如何从ST官方网站上下载STM32标准外设库(STM32F10x standard peripheral library)
  18. Windows图标空白问题解决记录
  19. APP地推心得:可复制的APP地推方案
  20. java 实现汉字转换拼音_Java实现汉字转换为拼音

热门文章

  1. si9000阻抗匹配计算_如何在设计之初计算出两层PCB板差分线的阻抗,线宽,间距...
  2. java main 如何不退出_为什么java main主线程退出了子线程还能运行;golang main结束所有协程都被结束了...
  3. 中国大学MOOC-陈越、何钦铭-数据结构-2019春期末考试(题目+部分解答)
  4. Git同时使用不同平台代码仓库
  5. 【SpringCloud】第五篇: 路由网关(zuul)
  6. Finally 与 return
  7. Servlet - cookie、session、servletContext概述
  8. Intent 的用法
  9. HTML--HTML对象的关于位置和大小的属性的图解
  10. 如何在虚拟机上安装wsus服务器,如何在Hyper-V虚拟机上安装WSUS服务器技巧