已采纳回答 / MartonZhang
要解释的话,可能不是三言两语能够说清楚,而且你也不一定能理解的了,这个问题先放下,留意一下我的下门课程:内存可见性,目前还没上线,下门课程看完就差不多理解了!
2015-03-13
讲师回答 / MartonZhang
标准做法是使用标志位退出,stop淘汰掉是因为会带来一些潜在的威胁,因为stop会在任何可能的时候停止线程,而不不一定是合理的时候,很有可能会带来线程的不安全或者死锁等问题。
2015-03-05
讲师回答 / MartonZhang
你好,安全的实现方式很明显是应该加互斥的,但是《深入浅出java多线程》中已经有了比较详细的讲解,所以我这里没必要做重复的讲解,课程的重点不在这里,没加入互斥也是为了给大家一些思考和改进的余地!
2015-03-05
讲师回答 / MartonZhang
你好,ticketsCont是实例变量,它的值自然是存在堆中(每个java对象在堆中都会占据一定内存,而实例变量的值就是存储在这块内存中,类似于结构体,因此每个对象对应一个ticketsCont的值),ticketsCont跟值传递没有关系啊,如果是Runnable方式的话,传递的也只是MyThread对象引用的副本,不管ticketsCont的事,但是因为ticketsCont的值在引用和引用副本所指向的堆内存中,所以无论是引用还是引用副本改变了堆内存中ticketsCont的值,都会产生效果!
2015-02-24
讲师回答 / MartonZhang
从报错中看是OpenJDK版本的问题,应该是-f参数在你当前版本的VM上不支持,如果要使用-f,貌似要JDK1.7以上,另外注意你的操作系统64位还是32位的,64位的貌似要加个参数,具体记不清了,你google一下!
2015-02-17
讲师回答 / MartonZhang
您好,加入volatile其实是通过加内存屏障使得每次读写volatile变量都从主内存中刷新,这样可以保证volatile变量及其之前的变量值的改变可以被其它线程立即看到,这当然前提是该变量是共享的,在这里可以保证不会出现打印出来的两个或三个相同count值的情况,跟其他的没有关系!
2015-02-10
讲师回答 / MartonZhang
另外,第一种情况,你要搞清楚,Ingeger是不能作为同步的对象的,因为容易发生拆装箱操作,比如你的count--,实际上相当于Integer count = new Integer(count-1);这个时候很明显,new出了一个新的Integer对象,已经不是原来的对象了,同步自然也就无效了!你可以去看下Integer的一些方法的源码!或者看下一些书对拆装箱部分的讲解!
2015-02-10
讲师回答 / MartonZhang
你好,出现两次“还剩3”是因为出现了数据竞争,有时甚至可能出现“还剩-1”的情况,你可以去分析下线程占用的时机,这个要用同步来解决,或者你给piao变量加个volatile关键字,这个你可以去看下《深入浅出java多线程》里面的讲解,或者查下资料,另外后面我应该也会录制一期内存可见性的视频,也会讲到这个,但是应该不是重点,因为这个在《深入浅出Java多线程》中已经有了!希望对你有所帮助!
2015-02-03