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 }

此写法可以用于一个大项目下多个解决方案之间通信!

posted on 2011-10-04 11:17  SplendidMe  阅读(336)  评论(0编辑  收藏  举报