黑马程序员技术交流社区

标题: 关于加锁的代码 [打印本页]

作者: zl918    时间: 2012-1-7 18:19
标题: 关于加锁的代码
本帖最后由 zl918 于 2012-1-14 10:47 编辑

帮忙看一下这段代码,它的执行顺序是怎么样的呢?
为什么执行结果是这样的呢?
执行结果:
m21  200
m2   200
a  200
m11  100
m1   100

  1. public class Hello extends Thread{
  2.         int b = 1;
  3.        
  4.         public synchronized void m1(){
  5.                 b = 100;
  6.                 System.out.println("m11  " + b);
  7.                 try {
  8.                         Thread.sleep(2500);
  9.                 } catch (InterruptedException e) {
  10.                         e.printStackTrace();
  11.                 }
  12.                 System.out.println("m1   " + b);
  13.         }
  14.        
  15.         public synchronized void m2(){
  16.                 b = 200;
  17.                 System.out.println("m21  " + b);
  18.                 try {
  19.                         Thread.sleep(2500);
  20.                 } catch (InterruptedException e) {
  21.                         // TODO Auto-generated catch block
  22.                         e.printStackTrace();
  23.                 }
  24.                 System.out.println("m2   " + b);
  25.         }
  26.        
  27.         @Override
  28.         public void run(){
  29.                 m1();
  30.                 //m2();
  31.         }
  32.        
  33.         public static void main(String [] args){
  34.                 Hello h = new Hello();
  35.                 Thread t = new Thread(h);
  36.                 t.start();
  37.                
  38.                 h.m2();
  39.                
  40.                 System.out.println("a  " + h.b);
  41.                
  42.         }
  43. }       
复制代码

作者: 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