都说Monitor.Enter/Exit需要引用类型作为参数才可以保证线程安全,我就想使用值类型看看会出现什么效果.代码如下:
class MyClass
{
private int value_lock = 0;
public void DoWork()
{
Monitor.Enter(value_lock);
Trace.WriteLine("Thread Name : " + Thread.CurrentThread.Name);
string sb = string.Empty; ;
for (int i = 0; i <= 50000; i++)
{
sb += i.ToString();
}
Trace.WriteLine("Over");
Monitor.Exit(value_lock);
}
}
class Program
{
static void Main(string[] args)
{
Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
Trace.AutoFlush = true;
MyClass monitor_class = new MyClass();
Thread m_thread_1 = new Thread(monitor_class.DoWork);
m_thread_1.Name = "Monitor Thread 1";
Thread m_thread_2 = new Thread(monitor_class.DoWork);
m_thread_2.Name = "Monitor Thread 2";
m_thread_1.Start();
m_thread_2.Start();
}
}
在Main()中定义了两个线程去模拟多线程操作.奇怪的是,当第二个线程调用Exit后却抛出了SynchronizationLockException异常.原先认为两个线程肯定同时执行,无法保证线程安全,但是现在出现了异常,百思不得其解...希望哪位大侠能解释的明白些.