想请问下,如果一个对象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
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 (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/
你好,谢谢你的回复,你和楼上的可能都误解我的意思了,你的示例,在lockobj被锁后,另一个线程试着获取锁肯定是获取失败,你们强调的是锁的使用问题
我的意思是,lockobj被一个线程lock后,另外的线程可以直接使用lockobj,比如lockobj.i=5;
我测试过,是可以的
所以我想要证明的是“我在网上找到的有些贴子说一个对象被锁了后,就不能使用了"这句话是错误的
http://msdn.microsoft.com/zh-cn/library/c5kehkcz%28VS.80%29.aspx
我的意思是,如下代码中的注释
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);
}
}
}
}
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);
}
}
}
}
这里做何解释??
lock(X)实际上产生一段临界代码,也就是保护下面的{
//不被同时执行的代码
}