總共就三種情況!!!!1.無限循環,number的值為0:在主線程即main方法中對ready的設置(即ready = true)還沒來得及寫回主存(靜態變數保存在方法區),ReaderThread 線程就已經讀取了ready的值(並保留了副本),然後載入到Java棧中,此時ready 一直為false所以出現死循環。number的值也可以類似推理,在主線程即main方法中對number的設置(即number= 42)還沒來得及寫回主存(靜態變數保存在方法區),ReaderThread 線程就已經讀取了number的值(並保留了副本),然後載入到Java棧中,此時number一直為0(只是沒有列印出來而已);
2.無限循環,number的值為42:在主線程即main方法中對ready的設置(即ready = true)還沒來得及寫回主存(靜態變數保存在方法區),ReaderThread 線程就已經讀取了ready的值(並保留了副本),然後載入到Java棧中,此時ready 一直為false所以出現死循環。在主線程即main方法中對number的設置(即number= 42)後(即number的值已經寫回了主存),ReaderThread 線程才開始執行此時讀取的number為42(只是沒有列印出來而已);
3.輸出0:在主線程即main方法中對ready的設置(即ready = true)後(即ready的值已經寫回了主存),還沒來得及寫回主存(靜態變數保存在方法區),ReaderThread 線程就已經讀取了number的值(並保留了副本),然後載入到Java棧中,此時number為0;
至於為什麼會出現ready = true寫回主存後,number = 42還沒寫回主存。這應該是由於Java虛擬機的一種優化技術叫指令重排序,number = 42不一定會在ready = true前面執行,得看Java虛擬機是怎麼優化的。
❷ java多線程並發問題怎麼解決
java多線程並發問題產生的主要原因是多個線程訪問一個實例,導致其中一個線程修改或刪除這個實例時,其他線程產生並發問題。
要解決這種並發問題有兩種方法:
(1)加上線程鎖synchronization
(2)還有個不是辦法的辦法:不用成員變數,用局部變數
❸ java 項目開發中中如何解決高並發問題
對於我們開發的網站,如果網站的訪問量非常大的話,那麼我們就需要考慮相關的並發訪問問題了。而並發問題是絕大部分的程序員頭疼的問題,
但話又說回來了,既然逃避不掉,那我們就坦然面對吧~今天就讓我們一起來研究一下常見的並發和同步吧。
為了更好的理解並發和同步,我們需要先明白兩個重要的概念:同步和非同步
1、同步和非同步的區別和聯系
所謂同步,可以理解為在執行完一個函數或方法之後,一直等待系統返回值或消息,這時程序是出於阻塞的,只有接收到
返回的值或消息後才往下執行其它的命令。
非同步,執行完函數或方法後,不必阻塞性地等待返回值或消息,只需要向系統委託一個非同步過程,那麼當系統接收到返回
值或消息時,系統會自動觸發委託的非同步過程,從而完成一個完整的流程。
同步在一定程度上可以看做是單線程,這個線程請求一個方法後就待這個方法給他回復,否則他不往下執行(死心眼)。
非同步在一定程度上可以看做是多線程的(廢話,一個線程怎麼叫非同步),請求一個方法後,就不管了,繼續執行其他的方法。
同步就是一件事,一件事情一件事的做。
非同步就是,做一件事情,不引響做其他事情。
例如:吃飯和說話,只能一件事一件事的來,因為只有一張嘴。
但吃飯和聽音樂是非同步的,因為,聽音樂並不引響我們吃飯。
對於Java程序員而言,我們會經常聽到同步關鍵字synchronized,假如這個同步的監視對象是類的話,那麼