黑马程序员技术交流社区
标题:
关于加锁的代码
[打印本页]
作者:
zl918
时间:
2012-1-7 18:19
标题:
关于加锁的代码
本帖最后由 zl918 于 2012-1-14 10:47 编辑
帮忙看一下这段代码,它的执行顺序是怎么样的呢?
为什么执行结果是这样的呢?
执行结果:
m21 200
m2 200
a 200
m11 100
m1 100
public class Hello extends Thread{
int b = 1;
public synchronized void m1(){
b = 100;
System.out.println("m11 " + b);
try {
Thread.sleep(2500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("m1 " + b);
}
public synchronized void m2(){
b = 200;
System.out.println("m21 " + b);
try {
Thread.sleep(2500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("m2 " + b);
}
@Override
public void run(){
m1();
//m2();
}
public static void main(String [] args){
Hello h = new Hello();
Thread t = new Thread(h);
t.start();
h.m2();
System.out.println("a " + h.b);
}
}
复制代码
作者:
zl918
时间:
2012-1-7 18:23
貌似启动线程很耗时间。。
作者:
李娟
时间:
2012-1-11 23:54
先把主线程的都执行完了,才去执行 t.start()。
作者:
李娟
时间:
2012-1-11 23:56
从结果看 先运行h.m2(); 然后 System.out.println("a " + h.b); 然后t.start()。
作者:
黄秋
时间:
2012-1-13 03:01
因为有synchronized ,所以m1,m2是同步函数,main运行的是主线程,t.start()开启一线程后,主线程继续执行h.m2(); 然后是 System.out.println("a " + h.b); 与此同时,开启的新线程也在执行m1,但m1,m2是同步函数,m1被锁住了,要m2完成才执行。
作者:
黄秋
时间:
2012-1-13 03:03
因为有synchronized ,所以m1,m2是同步函数,main运行的是主线程,t.start()开启一线程后,主线程继续执行h.m2(); 然后是 System.out.println("a " + h.b); 与此同时,开启的新线程也在执行m1,但m1,m2是同步函数,m1被锁住了,要m2完成才执行。
作者:
丁青松
时间:
2012-1-13 12:13
首先这是2个线程,一个主线程main,还有一个是new出来的hello,先执行t.start();注意,此时重写的run方法中只有m1();只是此时线程m1睡眠2500。此时运行h.m2(),此时,h.m2加锁,必须全部执行完,即打印出来后。等2500.执行下一个打印语句。注意m11 100 和a 100的出现顺序不确定,因为这两个也是随机出来的,因为h.m2()运行结束之后,m1是醒的。。。。。。。请多试几次看打印结果。。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2