为了账号安全,请及时绑定邮箱和手机立即绑定

细说多线程之Thread VS Runnable

难度初级
时长 1小时 0分
学习人数
综合评分9.63
171人评价 查看评价
9.8 内容实用
9.6 简洁易懂
9.5 逻辑清晰

已采纳回答 / MartonZhang
要解释的话,可能不是三言两语能够说清楚,而且你也不一定能理解的了,这个问题先放下,留意一下我的下门课程:内存可见性,目前还没上线,下门课程看完就差不多理解了!

讲师回答 / MartonZhang
标准做法是使用标志位退出,stop淘汰掉是因为会带来一些潜在的威胁,因为stop会在任何可能的时候停止线程,而不不一定是合理的时候,很有可能会带来线程的不安全或者死锁等问题。

讲师回答 / MartonZhang
你好,安全的实现方式很明显是应该加互斥的,但是《深入浅出java多线程》中已经有了比较详细的讲解,所以我这里没必要做重复的讲解,课程的重点不在这里,没加入互斥也是为了给大家一些思考和改进的余地!

讲师回答 / MartonZhang
你好,ticketsCont是实例变量,它的值自然是存在堆中(每个java对象在堆中都会占据一定内存,而实例变量的值就是存储在这块内存中,类似于结构体,因此每个对象对应一个ticketsCont的值),ticketsCont跟值传递没有关系啊,如果是Runnable方式的话,传递的也只是MyThread对象引用的副本,不管ticketsCont的事,但是因为ticketsCont的值在引用和引用副本所指向的堆内存中,所以无论是引用还是引用副本改变了堆内存中ticketsCont的值,都会产生效果!

讲师回答 / MartonZhang
从报错中看是OpenJDK版本的问题,应该是-f参数在你当前版本的VM上不支持,如果要使用-f,貌似要JDK1.7以上,另外注意你的操作系统64位还是32位的,64位的貌似要加个参数,具体记不清了,你google一下!

讲师回答 / MartonZhang
您好,加入volatile其实是通过加内存屏障使得每次读写volatile变量都从主内存中刷新,这样可以保证volatile变量及其之前的变量值的改变可以被其它线程立即看到,这当然前提是该变量是共享的,在这里可以保证不会出现打印出来的两个或三个相同count值的情况,跟其他的没有关系!

讲师回答 / MartonZhang
另外,第一种情况,你要搞清楚,Ingeger是不能作为同步的对象的,因为容易发生拆装箱操作,比如你的count--,实际上相当于Integer count  = new Integer(count-1);这个时候很明显,new出了一个新的Integer对象,已经不是原来的对象了,同步自然也就无效了!你可以去看下Integer的一些方法的源码!或者看下一些书对拆装箱部分的讲解!

讲师回答 / MartonZhang
你好,出现两次“还剩3”是因为出现了数据竞争,有时甚至可能出现“还剩-1”的情况,你可以去分析下线程占用的时机,这个要用同步来解决,或者你给piao变量加个volatile关键字,这个你可以去看下《深入浅出java多线程》里面的讲解,或者查下资料,另外后面我应该也会录制一期内存可见性的视频,也会讲到这个,但是应该不是重点,因为这个在《深入浅出Java多线程》中已经有了!希望对你有所帮助!
首页上一页12345下一页尾页
课程须知
学习本课程前,你需要熟练掌握Java的基础语法,熟悉Java中创建线程的两种方式,熟悉Java多线程中常用的一些方法。
老师告诉你能学到什么?
1、多线程创建方式的比较和选择 2、线程的生命周期、守护线程

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?

举报

0/150
提交
取消