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


    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,这样才能真正锁住代码段吧?

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

  • 相关阅读:
    实现who
    团队作业(一)——团队展示
    实验二 OpenSSL API使用
    cat userlist
    mypwd
    实验二 OpenSSL安装
    《Unix/Linux系统编程》第五章学习笔记 20201209戴骏
    团队展示——队员风采
    go module的常规操作
    磁盘空间满排查
  • 原文地址:https://www.cnblogs.com/davytitan/p/3024035.html
Copyright © 2020-2023  润新知