遊戲大廳 從基礎開始(7)–繞回來細說聊天室(中間偏下)之女僕編年史2

來源:互聯網
上載者:User
文章目錄
  • 老少爺們兒反擊戰

 

老少爺們兒反擊戰

上一篇中 我們的女僕終於可以做一些像陽光下其他人一樣的事情了,少爺們可以和女僕醬一起參加下午茶~ 難得的上流社會啊

這是永遠1v1被人私人的女奴 喝茶時被人共有的女僕醬最明顯的差異~

明媚的午後陽光下,庭院裡白色長餐桌兩旁,英俊的少爺們彼此交換著最近的趣聞軼事,一面欣賞女僕醬以1/3幾率打翻茶水,可愛而笨笨地努力侍奉著,閃閃發光的樣子。

人間極樂喵~~~~~~~~~~   :3

但距離真正的自由~~無Lock還是很遠,很遠。

因為,

老爺和少爺的調教仍然是一如既往的頻繁! 女僕醬你仍然是偉大的老少爺們的東西~!

 

我們看上一次所說的調用聊天室方式:

 

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.             }

這個行程可不得了

 

  1. 女僕來~~ (get instance)
  2. 調教~!(Say & writelock)
  3. 喝茶~!(Listen & readlock)

所有的少爺和老爺都是這個行程  執事先生,您是惡魔執事來的吧!(塞巴斯醬邪媚一笑)

雖然效率高了近一倍,但是 在奉茶的時候 仍然有調教的隊伍大排長龍~

 

 

這讓老少爺們很是不 不不爽 ! “主人樣”們是不會這樣滿足地口胡!~ 啊 太激動了,咽口水先。

-------------------------------------------------------------------------------------

最年輕的少爺在某個風和日麗的下午茶時間 提出了一個邪惡點子:

“既然我們喝茶的時候只是想看著女僕醬,又不是真的希望她倒茶,為啥我們不能一邊看著別人調教女僕醬  一邊喝茶呢?”

 

 

 

全體老少爺們的紅茶都化作血霧噴洒在無瑕的桌上,紛紛氣絕。

 

小少爺解釋道:

既然資料池實際上是一個隊列  而排入佇列僅僅是對隊列頭有所操作,

那麼在已經訪問過的節點另一端加入的內容 對於已經開始訪問內部內容的線程來說是毫無意義的

 

 

 

為了“不存在”的變化加鎖,這又是何苦呢?

 

“囊得斯嘎!?”

“艘得斯嘎!!”

“遊息!!”

爬起來的各位紛紛恍然大悟裝,激動地握住彼此的手,泛著淚光。。。。

 

 

 

可是為什麼我們之前要加鎖呢?

深入研究Queue<T> 的原始碼  我們瞭解到 Queue<T>的實現方法:定長數組實現的迴圈隊列

不熟悉迴圈隊列的兄弟們可以參考博友刺兒頭的文章

當每次 ToArray的時候 Queue<T>執行下面的操作

 

Code Snippet
  1.         public T[] ToArray()
  2.         {
  3.             T[] destinationArray = new T[this._size];
  4.             if (this._size != 0)
  5.             {
  6.                 if (this._head < this._tail)
  7.                 {
  8.                     Array.Copy(this._array, this._head, destinationArray, 0, this._size);
  9.                     return destinationArray;
  10.                 }
  11.                 Array.Copy(this._array, this._head, destinationArray, 0, this._array.Length - this._head);
  12.                 Array.Copy(this._array, 0, destinationArray, this._array.Length - this._head, this._tail);
  13.             }
  14.             return destinationArray;
  15.         \

同時有人Enqueue的時候  _size _head  _tail 都可能被並發修改

Code Snippet
  1.     public void Enqueue(T item)
  2.         {
  3.             if (this._size == this._array.Length)
  4.             {
  5.                 int capacity = (int)((this._array.Length * 200L) / 100L);
  6.                 if (capacity < (this._array.Length + 4))
  7.                 {
  8.                     capacity = this._array.Length + 4;
  9.                 }
  10.                 this.SetCapacity(capacity);
  11.             }
  12.             this._array[this._tail] = item;
  13.             this._tail = (this._tail + 1) % this._array.Length;
  14.             this._size++;
  15.             this._version++;
  16.         }

太危險了!

 

我們是為了保障這些關鍵標記量才用的Lock  這是數組核心本身限制造成的:( 

我們一開始就陷入了  “要用隊列,M$提供了隊列”的心理陷阱,

——果然觀賞女僕醬一定要喝茶是錯誤的常識

——看來聊天資料池還真的不能拿來主義

 

對於微軟類庫做不到的 我們一定要有自己的實現。 所以女僕醬啊,你的末日到了歐歐歐歐喝喝喝喝喝喝HiaHiaHia …..

 

敬請期待下一篇:

垃圾列表

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.