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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© outsider1020 中级黑马   /  2014-12-23 10:55  /  3318 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
public class TT implements Runnable {
         int b =100;
         public synchronized void m1() throws Exception
                b=1000 ;
                Thread .sleep( 5000);
                System .out. println("b=" +b);
         }
         public void m2() throws Exception {
                Thread .sleep( 2500);
                b=2000 ;
         }
         public void run() {
                try {
                         m1();
                } catch (Exception e) {
                        e .printStackTrace() ;
                }
         }
         public static void main(String [] args ) {
                TT tt=new TT ();
                Thread t=new Thread (tt);
                t .start() ;
               
                try {
                        Thread .sleep( 1000);
                } catch (InterruptedException e) {
                        e .printStackTrace() ;
                }
                try {
                        tt .m2();
                } catch (Exception e) {
                        e .printStackTrace() ;
                }
         }
}
执行结果为:
b=2000


最佳答案

查看完整内容

程序从main函数进去, |——开辟了一个t线程 ,t执行中b=1000再停留了5000毫秒 |——main线程继续向下执行停留了1000毫秒在调用了tt .m2()在停留2500毫秒后b=2000毫秒 所以当t线程停留在3500毫秒时 ,mian线程走完了了并改动了b=2000,所以t线程在停留1500毫秒 打印出来的是改动后的b

13 个回复

倒序浏览
程序从main函数进去, |——开辟了一个t线程  ,t执行中b=1000再停留了5000毫秒
                                  |——main线程继续向下执行停留了1000毫秒在调用了tt .m2()在停留2500毫秒后b=2000毫秒
所以当t线程停留在3500毫秒时 ,mian线程走完了了并改动了b=2000,所以t线程在停留1500毫秒 打印出来的是改动后的b
回复 使用道具 举报
进来学习了
回复 使用道具 举报
小徐_y8nUx 来自手机 中级黑马 2014-12-24 08:38:13
板凳
最好写的程序能有格式,不然看起来费劲
回复 使用道具 举报
进来学习学习
回复 使用道具 举报
小徐_y8nUx 发表于 2014-12-24 08:38
最好写的程序能有格式,不然看起来费劲

受教。。。
回复 使用道具 举报
些许 发表于 2014-12-23 18:43
程序从main函数进去, |——开辟了一个t线程  ,t执行中b=1000再停留了5000毫秒
                          ...

感谢。。。。。。。。。。。
回复 使用道具 举报
为什么不是1000,怎样修改才可以变为1000,LZ有了答案,发来看看哦
回复 使用道具 举报
因为没有循环,他只执行一次,当执行m1()给b赋值后,他就睡着了
在还没醒过来时候(大概2500ms后)m2被主线程执行了,给b赋值2000,然后m1醒了,就输出了2000
在这里不回出现锁的情况因为他们用的不是一个锁
回复 使用道具 举报
新人来学习
回复 使用道具 举报
线程同步是解决线程相互竞争一个资源发生的竞争。
回复 使用道具 举报
路过看看 学习学习!
回复 使用道具 举报
多学习。。
回复 使用道具 举报
先执行m1,再执行m2,对b的值进行了覆盖。假如你先执行m2,再执行m1,结果为就为1000
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马