关于lock 在线等啊?

v41dugu 2008-10-25 12:21:17
namespace ConsoleApplication1
{

class MyClass
{
public int num;
public void Fun()
{
lock (this)
{
num = 555;
Console.WriteLine("线程一锁住this了{0}",num);
Thread.Sleep(6000);
Console.WriteLine("线程一锁解开this了");
}
}
public void Fun2()
{
lock (this)
{
num = 999;
Console.WriteLine("线程二锁住this了{0}", num);
Thread.Sleep(6000);
Console.WriteLine("线程二锁解开this了");
}
}
}

class Program
{
static MyClass obj = new MyClass();
static Thread t1 = new Thread(new ThreadStart(obj.Fun));
//static Thread t2 = new Thread(new ThreadStart(obj.Fun2));
static void Main(string[] args)
{
MyClass obj = new MyClass();
t1.Start();
Thread.Sleep(500);
obj.Fun2();
//t2.Start();
}

}
}为什么Fun已经锁了this, 而再调用obj.Fun2(), 也去lock, 还是可以访问this啊? 如果改成下面这样(没有用obj调Fun2,也用的另开一个Thead调用) 为什么 Fun2就会等待Fun结束了之后再进行啊? 不懂啊????? 这里lock的原理到底是什么啊??
namespace ConsoleApplication1
{

class MyClass
{
public int num;
public void Fun()
{
lock (this)
{
num = 555;
Console.WriteLine("线程一锁住this了{0}",num);
Thread.Sleep(6000);
Console.WriteLine("线程一锁解开this了");
}
}
public void Fun2()
{
lock (this)
{
num = 999;
Console.WriteLine("线程二锁住this了{0}", num);
Thread.Sleep(6000);
Console.WriteLine("线程二锁解开this了");
}
}
}

class Program
{
static MyClass obj = new MyClass();
static Thread t1 = new Thread(new ThreadStart(obj.Fun));
static Thread t2 = new Thread(new ThreadStart(obj.Fun2));
static void Main(string[] args)
{
MyClass obj = new MyClass();
t1.Start();
Thread.Sleep(500);
//obj.Fun2();
t2.Start();
}

}
}
...全文
65 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
minioreo 2008-10-25
  • 打赏
  • 举报
回复
你的Static的obj1和Main里的obj1不是同一个对象
林g 2008-10-25
  • 打赏
  • 举报
回复
学习了!
minioreo 2008-10-25
  • 打赏
  • 举报
回复
呵呵
v41dugu 2008-10-25
  • 打赏
  • 举报
回复
疯了 晕 thanks.
minioreo 2008-10-25
  • 打赏
  • 举报
回复
你可以检查当前对象的GetHashCode()来看是不是同一个对象 同一个对象的GetHashCode()返回值是相同的
        public void Fun()
{
lock (this)
{
num = 555;
Console.WriteLine("线程一锁住this了{0}", num);
Console.WriteLine("当前对象:{0}",this.GetHashCode());
Thread.Sleep(6000);
Console.WriteLine("线程一锁解开this了");
}
}
public void Fun2()
{
lock (this)
{
num = 999;
Console.WriteLine("线程二锁住this了{0}", num);
Console.WriteLine("当前对象:{0}", this.GetHashCode());
Thread.Sleep(6000);
Console.WriteLine("线程二锁解开this了");
}
}


方法改成这样就很明显了 局部变量和外部Static变量重名的时候 内部对象就覆盖外部对象的名称了 所以此OBJ1非彼OBJ1

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧