C 設計模式之一 Singleton模式

2022-05-21 02:46:04 字數 3413 閱讀 8430

參考:

使用情況:

舉例如下:

以下**在控制台情況下,經過編譯 

using system;

using system.collections.generic;

using system.text;

using system.threading;

namespace singletonexample

class program

static void main(string args)

parameterizedthreadstart ts = new parameterizedthreadstart(enterplayer);

for (int i = 0; i < 20; i++)

thread t = new thread(ts);

t.start("player" + i);

loadbalanceserver.getloadbalanceserver().showserverinfo();

console.readline();

static void enterplayer(object playername)

loadbalanceserver lbs = loadbalanceserver.getloadbalanceserver();

lbs.getlobbyserver().enterplayer(playername.tostring());

//實現了singleton模式。負責入口,任何時候,都只有唯一例項

class loadbalanceserver

private const int server_count = 3;

private listserverlist = new list();

//任何時候,都有唯一的例項

private static volatile loadbalanceserver lbs;  //volatile 關鍵字表示字段可能被多個併發執行執行緒修改。宣告為 volatile 的字段不受編譯器優化(假定由單個執行緒訪問)的限制。這樣可以確保該字段在任何時間呈現的都是最新的值。

private static object synclock = new object();

public loadbalanceserver()

for (int i = 0; i < server_count; i++)

serverlist.add(new lobbyserver("lobbyserver" + i));

//獲得唯一例項

public static loadbalanceserver getloadbalanceserver()

if (lbs == null)

lock (synclock) //lock關鍵字可以用來確保**塊完成執行,而不會被其他執行緒中斷。這是通過在**塊執行期間為給定物件獲取互斥鎖來實現的。

if (lbs == null)

thread.sleep(100);

lbs = new loadbalanceserver();

return lbs;

//負責返回乙個壓力最小的lobbyserver物件

public lobbyserver getlobbyserver()

lobbyserver ls = serverlist[0];

for (int i = 1; i < server_count; i++)

if (serverlist[i].playerlist.count < ls.playerlist.count)

ls = serverlist[i];

return ls;

public void showserverinfo()

foreach (lobbyserver ls in serverlist)

console.writeline("***************==" + ls.servername + "***************==");

foreach (string player in ls.playerlist)

console.writeline(player);

//服務大廳類

class lobbyserver

private listplayerlist = new list();

public listplayerlist

get

private string servername;

public string servername

get

public lobbyserver(string servername)

this.servername = servername;

public void enterplayer(string playername)

playerlist.add(playername);

學習知識點:

1、volatile用法

2、lock用法。同時注意,lock也可以用監視器實現,即monitor,(enter和exit)他們是等效的。

使用lock關鍵字通常比直接使用monitor類更可取,一方面是因為lock更簡潔,另一方面是因為lock確保了即使受保護的**引發異常,也可以釋放基礎監視器。這是通過finally關鍵字來實現的,無論是否引發異常它都執行關聯的**塊。 

3、模式本身

4、多執行緒排程

我的例項

private void button1_click(object sender, eventargs e)

private void button2_click(object sender, eventargs e)

反覆點選button1 和button2 ,你會發現,messagebox.show的值是交替增加的,說明用的是同乙個類例項

private void add()

}public class singleton

set

}private static object synclock = new object();

public static singleton getsingletoninstance()

}return singletoninstance;}}

}

java設計模式 單例模式(Singleton)

設計模式 design pattern 是一套被反覆使用 經過分類編目 設計經驗的總結。目的 為了可重用 讓 更容易被他人理解 保證 的可靠性。適用場景 有些物件我們只需要乙個,比如,配置檔案 工具類 執行緒池 快取 日誌物件等。作用 保證整個應用程式中某個例項有且只有乙個。餓漢式 public c...

(原創)無廢話C 設計模式之二 Singleton

無廢話c 設計模式之二 singleton 意圖 保證乙個類只有乙個例項,並提供訪問它的全域性訪問點。場景 我們現在要做乙個網路遊戲的服務端程式,需要考慮怎麼樣才能承載大量的使用者。在做web程式的時候有各種負載均衡的方案,不管是通過硬體實現還是軟體實現,基本的思想就是有乙個統一的入口,然後由它來分...

(原創)無廢話C 設計模式之二 Singleton

無廢話c 設計模式之二 singleton 意圖 保證乙個類只有乙個例項,並提供訪問它的全域性訪問點。場景 我們現在要做乙個網路遊戲的服務端程式,需要考慮怎麼樣才能承載大量的使用者。在做web程式的時候有各種負載均衡的方案,不管是通過硬體實現還是軟體實現,基本的思想就是有乙個統一的入口,然後由它來分...