线程同步那点事。
先看段简单代码
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
------解决方案--------------------锁定只是锁定了界面更新,并不是不能访问和调用主线程的方法、变量
------解决方案--------------------
界面?临界区里的代码还说得过去