A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public class TT extends Thread {

int b = 100;

public synchronized void m1()throws Exception{

b=1000;

Thread.sleep(3000);

System.out.println("m1:"+"b="+b);

}

public  void m2(){

System.out.println("m2"+b);

}

public void run(){

try {

m1();

} catch (Exception e) {

// TODO: handle exception

}

}

public static void main(String[] args) throws Exception {

TT tt = new TT();

Thread t = new Thread(tt);

t.start();

Thread.sleep(100);

tt.m2();

}
}
答案是 先输出m2的1000 在输出m1的1000,这里我就不懂了,int b = 100;前面没有加static,为什么被改变了?我以为m2应该输出还是100的,公共变量,只要下面哪个方法里改了,这个变量本身值就真的改了吗?不需要加static的?

2 个回复

正序浏览
线程启动后,执行m1()方法,首先赋值b=1000;b为全局变量,然后停3秒。同时执行Thread.sleep(100);停时间很短100毫秒。执行tt.m2();
System.out.println("m2"+b);打印出m21000,然后3秒后执行System.out.println("m1:"+"b="+b);,打印m1:b=1000;
static 时静态意思,程序开始就分配内存,只要程序运行,就不会收回这个空间。
这个变量本身值改了。不需要加static
回复 使用道具 举报
public class TT extends Thread {

        int b = 100;

        public synchronized void m1() throws Exception {

               
                b = 1000;//请看此处,你是先赋值完再释放处理机去sleep
                Thread.sleep(3000);
                //b = 1000;//如果这行打开,就可以看到你想要的效果;

                System.out.println("m1:" + "b=" + b);

        }

        public void m2() {

                System.out.println("m2" + b);

        }

        public void run() {

                try {

                        m1();

                } catch (Exception e) {

                        // TODO: handle exception

                }

        }

        public static void main(String[] args) throws Exception {

                TT tt = new TT();

                Thread t = new Thread(tt);

                t.start();

                Thread.sleep(100);

                tt.m2();

        }
}
//只要下面哪个方法里改了,这个变量本身值就真的改了吗?因为你改动了变量引用的内存,所以它就是保存修改后的值;
//不需要加static的?static对于你这个问题并不需要;

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马