從“最簡單”的單例模式說起
public class Singleton
{
private static Singleton instance = null;
private static readonly object syncRoot = new object();
private Singleton()
{
}
public static Singleton GetInstance()
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
lock 確保當一個線程位於代碼的臨界區時,另一個線程不進入臨界區。如果其他線程試圖進入鎖定的代碼,則它將一直等待(即被阻止),直到該對象被釋放。
2、最後自己總結得出的三個結論:
a、c#中null是不能lock的(null會分配記憶體嗎,會佔用系統資源嗎?一起思考和探討吧)。
b、高手一出手,往往可以化腐朽為神奇。
c、對自己說:
加油。
3.在多解決方面下唯一的對象>單例模式實現
唯一對象
1 public class CardReaderHelper
2 {
3 #region 單例模式
4
5 static CardReaderHelper instance;
6 static object _lock = new object();
7
8 public static CardReaderHelper Instance
9 {
10 get
11 {
12 if (instance == null)
13 {
14 lock (_lock)
15 {
16 if (instance == null)
17 {
18 instance = new CardReaderHelper();
19 }
20 }
21 }
22 return instance;
23 }
24 }
25
26 #endregion
27
28 RFCardReader m_CardReader;
29 SerialPort sp;
30 BaudRate br;
31
32 CardReaderHelper()
33 {
34 this.Initialize();
35 }
36
37 void Initialize()
38 {
39 string strapp = EAS.Configuration.Config.GetValue("ComPort");
40 switch (strapp)
41 {
42 case "COM1": sp = RHDC.CardReader.SerialPort.COM1; break;
43 case "COM2": sp = RHDC.CardReader.SerialPort.COM2; break;
44 case "COM3": sp = RHDC.CardReader.SerialPort.COM3; break;
45 case "COM4": sp = RHDC.CardReader.SerialPort.COM4; break;
46 default: sp = RHDC.CardReader.SerialPort.COM1; break;
47 }
48 string baudRate = EAS.Configuration.Config.GetValue("BaudRate");
49 switch (baudRate)
50 {
51 case "115200": br = RHDC.CardReader.BaudRate._115200bps; break;
52 case "57600": br = RHDC.CardReader.BaudRate._57600bps; break;
53 case "38400": br = RHDC.CardReader.BaudRate._38400bps; break;
54 case "19200": br = RHDC.CardReader.BaudRate._19200bps; break;
55 case "14400": br = RHDC.CardReader.BaudRate._14400bps; break;
56 case "9600": br = RHDC.CardReader.BaudRate._9600bps; break;
57 default: br = RHDC.CardReader.BaudRate._115200bps; break;
58 }
59 try
60 {
61 m_CardReader = new RHDC.CardReader.RFCardReader(sp, br);
62 }
63 catch (Exception ex)
64 {
65 throw ex;
66 }
67
68 }
69
70 public RHDC.CardReader.RFCardReader CardReader
71 {
72 get
73 {
74 return m_CardReader;
75 }
76 }
77 }
此寫法可以用於一個大項目下多個解決方案之間通訊!