黑马程序员技术交流社区
标题:
线程中锁的应用的一个小程序问题。
[打印本页]
作者:
逝去的记忆ヽ
时间:
2012-6-13 15:35
标题:
线程中锁的应用的一个小程序问题。
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的?
作者:
李文富
时间:
2012-6-13 15:55
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对于你这个问题并不需要;
作者:
李海晓
时间:
2012-6-13 15:55
线程启动后,执行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
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2