weixin_44596740 2019-01-29 14:16 采纳率: 0%
浏览 309
已采纳

这个线程是怎么执行的?

package thread;

public class TT2 implements Runnable{
int b = 100;

public synchronized void m1() throws Exception{                 
    b = 1000;
    Thread.sleep(5000);
    System.out.println("b = " +  b);
}

public  synchronized void m2() throws Exception{
    Thread.sleep(7000);
    b = 2000;
}

public void run() {
    try {
        m1();
    }catch(Exception e) {
        e.printStackTrace();
    }
}

public static void main(String[] args)throws Exception{
    TT2 tt = new TT2();
    Thread t = new Thread(tt);
    t.start();
    tt.m2();
    System.out.println(tt.b);
}

}

打印的结果是: 1000   b=1000
我不明白这个结果是怎么来的,为什么不是先执行m1的锁呢
  • 写回答

3条回答 默认 最新

  • 洗洗脚泡泡澡 2019-01-29 14:52
    关注

    不知道你写这个是想实现什么或者为了测试什么,synchronized应用在方法上锁的是当前对象、t.start();当前对象执行的是M1,但是tt.m2()是
    另一个线程执行的,并且执行的是m2()方法,你可以再m2方法中打个日志试下。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置