千锋教育-做有情怀、有良心、有品质的IT职业教育机构
北京| 大连| 广州| 成都| 杭州| 长沙
上海| 深圳| 武汉| 郑州| 西安| 青岛| 重庆
千锋 西安java培训班的学生在某家公司面试的时候,遇到了一道Java开发笔试题,在后来的交流中,千锋老师认为这是一道很有意思的题目,决定放上来分析一波,希望能对学习Java的朋友有所帮助。
题目如下:
问该程序的输出结果。
在java中,多线程的程序较难理解、调试,很多时候执行结果并不像我们想象的那样执行。所以在java多线程特别难,依稀记得大学的时候考c语言二级的时候,里面的题目是什么++和很多其他优先级的符合在一起问输出结果,这类题目就想考一些运行符优先级和结合性问题,那个可以靠背诵掌握。但是,千锋老师认为,java多线程还是需要好好理解才行,单靠背是不行的。
下面开始简单分析:
该题目涉及到2个线程(主线程main、子线程)、关键词涉及到synchronized、Thread.sleep。
synchronized关键词还是比较复杂的(可能有时候没有理解到位所以上面题目会有点误区),他的作用就是实现线程的同步(实现线程同步有很多方法,它只是一种后续文章会说其他的,需要好好研究大神Doug Lea的一些实现),它的工作就是对需要同步的代码加锁,使得每一次只有一个线程可以进入同步块(其实是一种悲观策略)从而确保线程只记得安全性。
一般关键词synchronized的用法
指定加锁对象:对给定对象加锁,进入同步代码前需要活的给定对象的锁。
直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。
直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获得当前类的锁。
上面的代码,synchronized用法其实就 属于第二种情况。直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。
可能存在的误区
由于对synchronized理解的不到为,由于很多时候,我们多线程都是操作一个synchronized的方法,当2个线程调用2个不同synchronized的方法的时候,认为是没有关系的,这种想法是存在误区的。直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。
如果一个调用synchronized方法。另外一个调用普通方法是没有关系的,2个是不存在等待关系的。
这些对于后面的分析很有作用。
Thread.sleep
使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常,对于后面的分析很有作用。
分析流程
java 都是从main方法执行的,上面说了有2个线程,但是这里就算修改线程优先级也没用,优先级是在2个程序都还没有执行的时候才有先后,现在这个代码一执行,主线程main已经执行了。对于属性变量 int b =100由于使用了synchronized也不会存在可见性问题(也没有必要在说使用volatile申明),当执行1步骤的时候(Thread t = new Thread(tt); //1)线程是new状态,还没有开始工作。当执行2步骤的时候(t.start(); //2)当调用start方法,这个线程才正真被启动,进入runnable状态,runnable状态表示可以执行,一切准备就绪了,但是并不表示一定在cpu上面执行,有没有真正执行取决服务cpu的调度。在这里当执行3步骤必定是先获得锁(由于start需要调用native方法,并且在用完成之后在一切准备就绪了,但是并不表示一定在cpu上面执行,有没有真正执行取决服务cpu的调度,之后才会调用run方法,执行m1方法)。这里其实2个synchronized方法里面的Thread.sheep其实要不要是无所谓的,估计是就为混淆增加难度。3步骤执行的时候其实很快子线程也准备好了,但是由于synchronized的存在,并且是作用同一对象,所以子线程就只有必须等待了。由于main方法里面执行顺序是顺序执行的,所以必须是步骤3执行完成之后才可以到4步骤,而由于3步骤执行完成,子线程就可以执行m1了。这里就存在一个多线程谁先获取到问题,如果4步骤先获取那么main thread b=2000,如果子线程m1获取到可能就b已经赋值成1000或者还没有来得及赋值4步骤就输出了可能结果就是main thread b=1000或者main thread b=2000,在这里如果把6步骤去掉那么b=执行在前和main thread b=在前就不确定了。但是由于6步骤存在,所以不管怎么都是main thread b=在前面,那么等于1000还是2000看情况,之后b=1000是一定固定的了。
千锋 西安java培训班的老师很注重与同学们的交流与感情培养,因此,手中也有大量的Java面试、笔试真题,有兴趣的朋友,可以来千锋西安校区,我们一起交流,一起学习,共同进步。
上一篇: 千锋西安Java培训分享常见面试题 千锋带你拿
下一篇: 千锋西安Java进阶培训:新的面试题分享
入职一年多崔志波工作非常好,感谢千锋培养的人才。
周红梅,有较强的学习能力,是有发展潜力的年轻人。
郑秋浩思想灵活,能按时保质保量完成工作内容。
西安校区咨询电话
029-85363390 18610973034
了解千锋动态
关注千锋教育服务号
扫码关注千锋互联
身边的移动开发导师
深圳SEO优化公司昆明阿里店铺运营推荐湖州百度网站优化价格无锡营销型网站建设哪家好三明优化公司大丰优化唐山网站优化按天计费多少钱南山企业网站改版报价郴州网站推广推荐新乡网络广告推广天门seo多少钱南联网站优化推广公司德宏网站推广方案丹东百度爱采购价格临猗网站搜索优化多少钱江门SEO按天计费东营seo报价坂田网站seo优化兰州SEO按天收费哪家好资阳建设网站甘南阿里店铺托管莆田百度竞价推荐宁波百度seo价格垦利网站设计模板多少钱大理优化推荐防城港网站推广工具价格随州营销型网站建设十堰阿里店铺托管价格绥化seo网站推广推荐陇南网站关键词优化哪家好延安网站改版哪家好歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运