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),保证它在处理的时候不会影响其他线程
[解决办法]
“一个对象被锁了后,就不能使用了”
相信我,那绝对不是整句话,撸主绝对是断章取义了。