講師回答 / MartonZhang
標準做法是使用標志位退出,stop淘汰掉是因為會帶來一些潛在的威脅,因為stop會在任何可能的時候停止線程,而不不一定是合理的時候,很有可能會帶來線程的不安全或者死鎖等問題。
2015-03-05
講師回答 / MartonZhang
你好,安全的實現(xiàn)方式很明顯是應(yīng)該加互斥的,但是《深入淺出java多線程》中已經(jīng)有了比較詳細的講解,所以我這里沒必要做重復(fù)的講解,課程的重點不在這里,沒加入互斥也是為了給大家一些思考和改進的余地!
2015-03-05
講師回答 / MartonZhang
你好,ticketsCont是實例變量,它的值自然是存在堆中(每個java對象在堆中都會占據(jù)一定內(nèi)存,而實例變量的值就是存儲在這塊內(nèi)存中,類似于結(jié)構(gòu)體,因此每個對象對應(yīng)一個ticketsCont的值),ticketsCont跟值傳遞沒有關(guān)系啊,如果是Runnable方式的話,傳遞的也只是MyThread對象引用的副本,不管ticketsCont的事,但是因為ticketsCont的值在引用和引用副本所指向的堆內(nèi)存中,所以無論是引用還是引用副本改變了堆內(nèi)存中ticketsCont的值,都會產(chǎn)生效果!
2015-02-24
講師回答 / MartonZhang
從報錯中看是OpenJDK版本的問題,應(yīng)該是-f參數(shù)在你當前版本的VM上不支持,如果要使用-f,貌似要JDK1.7以上,另外注意你的操作系統(tǒng)64位還是32位的,64位的貌似要加個參數(shù),具體記不清了,你google一下!
2015-02-17
講師回答 / MartonZhang
您好,加入volatile其實是通過加內(nèi)存屏障使得每次讀寫volatile變量都從主內(nèi)存中刷新,這樣可以保證volatile變量及其之前的變量值的改變可以被其它線程立即看到,這當然前提是該變量是共享的,在這里可以保證不會出現(xiàn)打印出來的兩個或三個相同count值的情況,跟其他的沒有關(guān)系!
2015-02-10
講師回答 / MartonZhang
另外,第一種情況,你要搞清楚,Ingeger是不能作為同步的對象的,因為容易發(fā)生拆裝箱操作,比如你的count--,實際上相當于Integer?count ?= new Integer(count-1);這個時候很明顯,new出了一個新的Integer對象,已經(jīng)不是原來的對象了,同步自然也就無效了!你可以去看下Integer的一些方法的源碼!或者看下一些書對拆裝箱部分的講解!
2015-02-10
講師回答 / MartonZhang
你好,出現(xiàn)兩次“還剩3”是因為出現(xiàn)了數(shù)據(jù)競爭,有時甚至可能出現(xiàn)“還剩-1”的情況,你可以去分析下線程占用的時機,這個要用同步來解決,或者你給piao變量加個volatile關(guān)鍵字,這個你可以去看下《深入淺出java多線程》里面的講解,或者查下資料,另外后面我應(yīng)該也會錄制一期內(nèi)存可見性的視頻,也會講到這個,但是應(yīng)該不是重點,因為這個在《深入淺出Java多線程》中已經(jīng)有了!希望對你有所幫助!
2015-02-03