zkzk7410 2017-04-23 08:48 采纳率: 68.8%
浏览 818
已采纳

[小白求指点]java线程同步问题

package com.test;

public class TT 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(2500);
b = 2000;
}

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

public static void main(String[] args) throws Exception {
    TT tt = new TT();
    Thread t = new Thread(tt);
    t.start();
    tt.m2();
}

}
=======================================

小弟认为结果应该是2000,理由:在m1执行后此时b值为1000且休眠5秒,但是m2将b值修改为2000且休眠2.5秒,等到m1的5秒结束后显示b值,此时b值为2000。

但是,系统出来的结果是1000,小弟不理解,请求指点。谢谢!

  • 写回答

5条回答 默认 最新

  • weixin_38388710 2017-04-23 11:21
    关注

    流程分析:首先主线程执行创建一个套套(tt)对象(注意:此对象只有一把锁),然后再创建一个t线程并开启。
    t线程和主线程争抢控制权,假设t线程获得控制权,进入run方法执行m1(注意:m1使用套套的锁),m1使t线程睡眠
    5秒(注意:但并未释放套套的锁),在这段时间主线程又获得了控制权,主线程调用m2(注意:m2也是使用synchronized修饰)
    方法,但是套套的锁还在m1中使用,主线程就尝试去获取这把锁,所以只有m1执行完释放锁,主线程才能获得这把锁,
    才能执行m2方法。去掉m2的synchronized即可获得你想要的结果。手打不易不喜勿喷。

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

报告相同问题?

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算