已采納回答 / 特南克斯
main 線程是會(huì)和? new 出來(lái)的線程并行執(zhí)行的,如果沒(méi)有那個(gè) while 判斷,下面這行代碼<...code...>就會(huì)在其他線程執(zhí)行完之前就執(zhí)行了。加 while 判斷,就是為了等五百個(gè)線程執(zhí)行完畢
2018-10-14
已采納回答 / 自有如風(fēng)
你看看這樣能不能理解:number的值可以存在三個(gè)地方:主內(nèi)存,cpu緩存,cpu寄存器。因?yàn)榧由狭藇olatile關(guān)鍵字,cpu每次對(duì)number的讀取都強(qiáng)迫cpu緩存從主內(nèi)存中讀取。但是count++操作有三步,讀count,計(jì)算count+1,將計(jì)算的結(jié)果給count。假設(shè)讀count已經(jīng)執(zhí)行了,number已經(jīng)放到了cpu寄存器中。此時(shí)當(dāng)執(zhí)行權(quán)被其他線程搶走之后再次輪到當(dāng)前線程執(zhí)行的時(shí)候,已經(jīng)不需要再讀number了。故number還是沒(méi)有變化
2018-08-10
已采納回答 / 一葉秋才
這個(gè)Dome告訴你 編譯時(shí)可能存在其它結(jié)果,導(dǎo)致數(shù)據(jù)不安全
public?static?void?main(String[]?args)?{ ????SynchronizedDemo?synchronizedDemo=new?SynchronizedDemo(); ???????synchronizedDemo.new?ReadWriteThread(true).st...
已采納回答 / 我是貓_夏
互斥鎖,同一時(shí)間,只能 有一個(gè)線程持有該對(duì)象的引用,對(duì)該對(duì)象進(jìn)行操作
已采納回答 / 再冷也要光著腳
還有一個(gè)監(jiān)控線程的存在:Monitor Ctrl-Break 可以將活動(dòng)線程數(shù)改為>2,具體原因你可以查下 百度上有很多 我就不粘貼了。。
2018-04-24
已采納回答 / annnn
A線程的工作變量里已經(jīng)讀過(guò)number=5,B線程改變以后number=6后,的確會(huì)強(qiáng)迫store到主內(nèi)存,但是這與A線程的工作變量無(wú)關(guān),A線程讀取的時(shí)候已經(jīng)load過(guò)了,不會(huì)主動(dòng)再load,所以number=5
2018-03-18
最贊回答 / 你猜能
加了volatile就會(huì)一次讀寫(xiě),不會(huì)分為兩次讀寫(xiě)。跟volatile不能保證原子性沒(méi)有關(guān)系。
2017-08-05
已采納回答 / Peng_0008
加注釋?zhuān)啻尉幾g,多次執(zhí)行。
已采納回答 / 憂(yōu)傷的帥哥
不管怎么重排序(編譯器和處理器為了提高并行度),(單線程)程序的執(zhí)行結(jié)果不能被改變。java內(nèi)存中的變量都有指針引用,上下文引用成鏈,這個(gè)鏈?zhǔn)遣粫?huì)被打亂重排序的,只有沒(méi)有數(shù)據(jù)依賴(lài)關(guān)系的代碼,才會(huì)被沖排序,所以在單線程內(nèi)部重排序不會(huì)改變程序運(yùn)行結(jié)果,這就是as-if-serial
已采納回答 / zvc888
每個(gè)線程都有一個(gè)自己的內(nèi)存空間,當(dāng)線程啟動(dòng)的時(shí)候把變量從共享內(nèi)存拷貝一份到私有內(nèi)存,在這個(gè)變量更改后,需要push到共享內(nèi)存,其他線程才能讀取到變量新的值;
2017-02-19
已采納回答 / 民國(guó)之后再無(wú)大學(xué)
JVM