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

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

  • 相关阅读:
    MYSQL定时任务 触发器
    mybatis 学习
    SSM 记录
    环境变量配置
    servlet 拦截器 (filter)
    验证码
    jquery $.ajax({});参数详解
    maven打包忽略静态资源解决办法,dispatchServlet拦截静态资源请求的解决办法
    switch..case..
    HDU 1005 题解
  • 原文地址:https://www.cnblogs.com/davytitan/p/3024035.html
Copyright © 2011-2022 走看看