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

lock obj的问题,求助!!!
想请问下,如果一个对象obj被锁了,那么其他线程是不是可以使用这个对象呢?我在网上找到的有些贴子说一个对象被锁了后,就不能使用了,但我自己测试了一下,是可以用的呀,如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Runtime.Remoting.Messaging;

namespace CLR_Thread
{
    public class LockClass
    {
        public int i;
        public LockClass(int n)
        {
            i = n;
        }
    }
    class Program
    {
        private static readonly LockClass lockobj = new LockClass(3);
        static void Main(string[] args)
        {
            Thread lockThd = new Thread(LockMethod);
            lockThd.Start();
            Thread.Sleep(2000);//让lockThd线程第一个执行,先lock lockobj
            Thread useThd = new Thread(UseLockObj);//这个线程在lockobj锁定后,测试lockobj能否使用
            useThd.Start();
        }
        static void UseLockObj()
        {
            Console.WriteLine(lockobj.i);
        }
        static void LockMethod()
        {
            lock (lockobj)
            {
                Console.WriteLine("lockobj is locked");
                Thread.Sleep(10000);
            }
        }
    }
}

程序在输出“lockobj is locked”后经过2秒输出了"3",证明对象被锁后仍然是可以被其他线程使用的呀,求解释!
线程 lock

------解决方案--------------------
lock(X)很多人错误理解为“保护”X这个对象。
lock(X)实际上产生一段临界代码,也就是保护下面的
{
//不被同时执行的代码
}

------解决方案--------------------
“一个对象被锁了后,就不能使用了”这句话是错的

LockMethod和UseLockObj都可以修改i,但是你不能确定具体什么时候会修改