參考:
使用情況:
舉例如下:
以下**在控制台情況下,經過編譯
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程式的時候有各種負載均衡的方案,不管是通過硬體實現還是軟體實現,基本的思想就是有乙個統一的入口,然後由它來分...