public class TT implements Runnable {
int b = 100;

public synchronized void m1() throws Exception {
b = 1000;
Thread.sleep(1000);
System.out.println("b =" + b);
}

public synchronized void m2() throws Exception {
Thread.sleep(3000);
b = 2000;
}

public void run() {
try {
m1();
} catch(Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
tt.m2();
                Thread.sleep(5000);
System.out.println(tt.b);
}
}
运行结果:b =1000
1000
我是这样分析的: t线程开始, 调用run(), run()里面调用m1()方法, m1方法被锁定, b赋值为1000, 然后睡眠1000毫秒
打印b = 1000 , 接着调用m2(), m2()方法被锁定,因为只有m1()执行完才能执行m2(), 刚才m1()执行完了, m2睡眠3000毫秒,
然后b赋值为2000, 主线程睡眠5000毫秒, 然后输出tt.b为2000 , 但是结果为什么是1000呢 ? 不是在m2()里面b被赋值为2000了吗?

解决方案 »

  1.   

    start线程不一定马上执行,这里是tt先执行了
    可以在
    t.start();
    tt.m2();
    之间加入个sleep来保证t先执行
      

  2.   


    就是说, 如果在t.start();和tt.m2();之间不加sleep的话, 这个tt.b有可能是1000, 有可能是2000,
    因为在默认的优先级情况下, 不能保证谁先谁后, 是这个道理吧?我刚才调试了一下, 发现tt.b有时为2000, 有时为1000
      

  3.   


    刚才那个帖m2()方法没有加锁, 这个帖里面, m1和m2都设置为同步了
      

  4.   

    弱问:进到m2方法中之后就是新的一个线程吗?我的理解是,于主线程调用m2方法,那么m2方法内部的代码也是位于主线程的控制范围,于是m2中的sleep应该与主线程的sleep意思一样吧?事实上,通过调试可以发现,程序中只有两个线程:主线程和tt线程问题是:为什么会出现输出1000的情况无论怎么想,同一线程后面的代码没有道理先执行啊 = = 阿宝大虾解释一下 = =
      

  5.   


    就是这个意思,线程的执行是随机的,start不代表就立即执行。
      

  6.   

    只有2个线程,主线程和一个new出来的t线程,主线程调用m2,m2方法中没有别的线程,就是主线程调用的
    主线程先调用m2,b=2000,然后主线程sleep(5000),这时t线程启动执行m1,b=1000,然后t线程打印1000,执行结束,主线程sleep时间到,打印tt.b,因为b已经被t修改了,所以是1000
      

  7.   

    补充一点,m2方法的sleep是主线程的sleep,但是方法是synchronize的,所以m2不执行结束,t就不能执行m1,必须等待m2执行结束
      

  8.   

    注明: 视频里源代码[ m1()里面Thread.sleep(5000) m2()里面Thread.sleep(2500) ],我这里反过来改了一下
    刚才看了一下视频里的分析, 马士兵是这样说的:
    main程序执行到start, 分出一进程t, run方法执行m1()往下执行, 然后main程序往下执行
    于是到了tt.m2()这句, 由于m2()锁死, m1()只能等到m2()执行完才能执行它的一下句子于是m2()执行, m2()睡眠2500毫秒之后 b被赋值为2000, 好了, m2()执行完了,这个时候m1()才能开始
    执行, 于是m1()里面 b的值又被赋值为1000, 赋值之后m1()开始睡眠5000秒(按照源代码来),
    睡眠期间, 现在开始执行main里面的println . 于是打印了tt.b为1000, 然后执行m1()里面的println,
    于是接着打印 b = 1000 ;
      

  9.   


    在main程序里面, 主线程的优先级是否大于其他线程优先级呢?