zoukankan      html  css  js  c++  java
  • 关于一个多线程面试题的理解

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

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

  • 相关阅读:
    docker安装和hub
    sql获取时间、年龄
    在eclipse中配置Tomcat时,出现“Cannot create a server using the selected type”的错误。
    ajax简单做html查询删除(鲜花)
    java使用jsp建立项目+视频
    java根据数据库自动生成代码
    java连接数据库增删改查公共方法
    制作二维码java
    富文本编译器
    java字符串类型和时间类型的转换
  • 原文地址:https://www.cnblogs.com/davytitan/p/3024035.html
Copyright © 2011-2022 走看看