想请问下,如果一个对象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

解决方案 »

  1.   

    你好,这里是竟争使用吧,线程1锁定了lockobj,并且持续10秒,在线程1刚锁定了lockobj后,线程2就使用了lockobj呀
      

  2.   

    static void UseLockObj()
            {
                lock (lockobj)
                {
                Console.WriteLine(lockobj.i);
    }
            }
            static void LockMethod()
            {
                lock (lockobj)
                {
                    Console.WriteLine("lockobj is locked");
                    Thread.Sleep(10000);lockobj.i=5;
                }
            }
      
    *****************************************************************************
    签名档: http://feiyun0112.cnblogs.com/
      

  3.   


    你好,谢谢你的回复,你和楼上的可能都误解我的意思了,你的示例,在lockobj被锁后,另一个线程试着获取锁肯定是获取失败,你们强调的是锁的使用问题
    我的意思是,lockobj被一个线程lock后,另外的线程可以直接使用lockobj,比如lockobj.i=5;
    我测试过,是可以的
    所以我想要证明的是“我在网上找到的有些贴子说一个对象被锁了后,就不能使用了"这句话是错误的
      

  4.   

    是你理解错lock语句的意义了。lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放
    http://msdn.microsoft.com/zh-cn/library/c5kehkcz%28VS.80%29.aspx
      

  5.   

    你好,你的意思我明白,而且这里我没有疑问
    我的意思是,如下代码中的注释
    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()
            {
                //此时lockobj已被lockThd线程锁了(lockThd持续10s),但这里不影响访问lockobj.i
                //那么是不是 “一个对象被锁了后,就不能使用了”这句话不就是错的,注意我的意思
                //这里lockobj在被锁了的情况仍然可以访问使用
                lockobj.i=5;
                Console.WriteLine(lockobj.i);
            }
            static void LockMethod()
            {
                lock (lockobj)
                {
                    Console.WriteLine("lockobj is locked");
                    Thread.Sleep(10000);
                }
            }
        }
    }
      

  6.   


    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()
            {
                //此时lockobj已被lockThd线程锁了(lockThd持续10s),但这里不影响访问lockobj.i
                //那么是不是 “一个对象被锁了后,就不能使用了”这句话不就是错的,注意我的意思
                //这里lockobj在被锁了的情况仍然可以访问使用
                lockobj.i=5;
                Console.WriteLine(lockobj.i);
            }
            static void LockMethod()
            {
                lock (lockobj)
                {
                    Console.WriteLine("lockobj is locked");
                    Thread.Sleep(10000);
                }
            }
        }
    }
     这里做何解释??
      

  7.   

    lock(obj){ something code;} 我这里的意思是,线程1 lock(obj)  那么在另外一个线程2,在obj还在锁的情况下能不能访问obj,我并不是指线程2里面也存在lock(obj)我这里强调的不是something code,而是lock(obj)中的obj
      

  8.   

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

  9.   

    “一个对象被锁了后,就不能使用了”这句话是错的LockMethod和UseLockObj都可以修改i,但是你不能确定具体什么时候会修改LockMethod用lock(obj)正是为了保证something code;在处理的时候不会受其他线程影响,得到不可预知的损坏数据因此,UseLockObj同样需要lock(obj),保证它在处理的时候不会影响其他线程