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