首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

lock obj的有关问题,

2013-10-18 
lock obj的问题,求助!!!想请问下,如果一个对象obj被锁了,那么其他线程是不是可以使用这个对象呢?我在网上

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,但是你不能确定具体什么时候会修改

LockMethod用lock(obj)正是为了保证something code;在处理的时候不会受其他线程影响,得到不可预知的损坏数据

因此,UseLockObj同样需要lock(obj),保证它在处理的时候不会影响其他线程


[解决办法]
“一个对象被锁了后,就不能使用了” 
相信我,那绝对不是整句话,撸主绝对是断章取义了。

热点排行