mytest t2 = new mytest();原题目是这样的:
根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。
{
lock(this)
{
if (i>10)
{
i--;
test(i);
}
}
}
百度了一下,有人说如果i是引用类型就会死锁;
个人理解,这个,死不死锁,跟 int i,一点关系都没有,因为,如果要当成线程执行的方法,test必须写成 public void test(object i){} 这个形式的,不然编译都会报错,
而造成死锁的关键,就是lock(this);这句的意思,锁定当前实例;注意:是当前实例;
我的理解是,如果多线程执行的是一个实例的该方法,那么,lock是起作用的,当i <10;肯定死锁了,因为永远都跳不出去了;
而如果每个线程执行的都是单独的实例,比如
mytest t1 = new mytest();mytest t2 = new mytest();mytest t3 = new mytest();
thread th1 = new Thread(t1.test); thread th2 = new Thread(t2.test);thread th3 = new Thread(t3.test);
那么,这个Lock是不起作用的; 这个可以通过输入 Thread.CurrentThread.ManagedThreadId 来验证;(这是线程的ID)
所以,这么看 最标准的lock对象,应该是这样的 ,private static object ob = new object(); lock(ob){}
因为 private可以保证几乎不会外界的人来修改ob,而static 又保证了,不管多少实例,都只有一个Ob,这样才能真正锁住代码段吧?
以上是个人的理解,不知道对不对,希望看到文章的朋友,多交流下,这个地方,我也一直都很迷糊;