c#中使用lock的是与非
从“最简单”的单例模式说起
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 }
此写法可以用于一个大项目下多个解决方案之间通信!