日期:2014-05-17  浏览次数:20889 次

线程同步那点事。
先看段简单代码
namespace ConsoleTest
{
    public class Program
    {
        private static void Main()
        {
            var someClassObj = new SomeCalss();

            // 锁定 someClassObj 对象
            Monitor.Enter(someClassObj);

            //线程池 开始一个工作项
            ThreadPool.QueueUserWorkItem(o => Console.WriteLine(someClassObj.A));

            Thread.Sleep(4000);
            Console.WriteLine("主线程 Sleep 4s 结束了。");

            //释放 someClassObj 对象
            Monitor.Exit(someClassObj);

            Console.ReadKey();
        }
    }

    public class SomeCalss
    {
        public int A = 3;
    }
}

结果输出如下:
3
主线程 Sleep 4s 结束了。

我的疑问是,主线程锁定 someClassObj 后,其他线程(这里是线程池的线程)不是就不能访问 someClassObj 对象的成员了吗?
为什么它会先打印出3,然后再打印 “主线程 Sleep 4s 结束了。”
我以为结果应该倒过来。


------解决方案--------------------
主线程锁定 someClassObj 后,其他线程(这里是线程池的线程)不是就不能访问 someClassObj 对象的成员了吗?

谁告诉你的?

 ThreadPool.QueueUserWorkItem(o => {lock(someClassObj) Console.WriteLine(someClassObj.A);});
------解决方案--------------------

ThreadPool.QueueUserWorkItem(o =>
            { Monitor.Enter(someClassObj); ; Console.WriteLine(someClassObj.A); Monitor.Exit(someClassObj); });

这样才行。给分。
------解决方案--------------------
LZ想当然了
http://msdn.microsoft.com/zh-cn/library/c5kehkcz(VS.80).aspx
------解决方案--------------------
锁定只是锁定了界面更新,并不是不能访问和调用主线程的方法、变量
------解决方案--------------------
引用:
锁定只是锁定了界面更新,并不是不能访问和调用主线程的方法、变量

界面?临界区里的代码还说得过去