关于一个多线程面试题的理解

mytest t2 = new mytest();原题目是这样的:

根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。

public void test(int i)
{
   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,这样才能真正锁住代码段吧?

 以上是个人的理解,不知道对不对,希望看到文章的朋友,多交流下,这个地方,我也一直都很迷糊;

原文地址:https://www.cnblogs.com/davytitan/p/3024035.html