YXTS122 2016-07-02 14:22 采纳率: 100%
浏览 946
已采纳

谁能讲下这运行结果怎么来的?谢谢!

我写c/c++代码时,可以通过调试观察每条语句,可是这java代码该怎么研究
每条代码的意思,哪位大神讲讲这运行结果是怎么来的?

 class MyValue
{
    private int data;
    public void m()
    {
        int result=0;
        result+=2;
        data+=2;
        System.out.println(result+" "+data);
    }
}

class MyThread extends Thread
{
    private MyValue mv;
    public MyThread(MyValue mv)
    {
        this.mv=mv;
    }
    public void run()
    {
        synchronized(mv)
        {
            mv.m();
        }
    }
}

public class TestMyThread
{
    public static void main(String args[])
    {
        MyValue mv=new MyValue();
        Thread t1=new MyThread(mv);
        Thread t2=new MyThread(mv);
        Thread t3=new MyThread(mv);
        //t1.start();
        //t2.start();
        t3.start();
    }
}

图片说明

  • 写回答

2条回答 默认 最新

  • qilinzhengzhuan 2016-07-02 14:37
    关注

    因为你在创建三个线程时传了同一个对象mv过去,而这个对象作为正是作为同步代码块的锁对象的synchronized(mv)
    那么,这三个线程共享这个对象(mv)的成员变量(data),所以,任意线程对data的改变都是有效的,会影响到其他线程对data进行操作时,data的初始值。
    而在不同线程进入mv.m();也就是执行这段代码时
    int result=0;
    result+=2;
    data+=2;
    System.out.println(result+" "+data);
    都会创建一个变量result,所以每个线程每次操作的result变量虽然变量名相同,但确实已经是不同的变量了,在内存中的地址值是不同的,所以。
    各线程不影响别人的result。

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

报告相同问题?

悬赏问题

  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常