一個Java線程問題,公司的程序員吵翻了

一個Java線程問題,公司的程序員吵翻了

廢話不多說,直接上題

一個Java線程問題,公司的程序員吵翻了

先看下圖 1 中的代碼,並思考下程序輸出情況?

圖1 輸出情況是怎樣? 單選

0

0%

A.死循環

0

0%

B.打印 i 的值

同事小鹿:Are you kidding me ? 根據 JMM(Java 內存模型) ,flag 一直為 false,程序會進入死循環。

一個Java線程問題,公司的程序員吵翻了

你自己運行下。

......

我丟,這輸出結果,咋回事???

一個Java線程問題,公司的程序員吵翻了

小路:我發現 while 循環體去掉第 22 行:

System.out.println("flag = " + flag);

程序會進入死循環,難道是由於 system 中有 synchronized 導致,但是主線程也不是馬上就能讀取到 flag 的最新值。

一個Java線程問題,公司的程序員吵翻了

小路,先不急,我不用 system,沒有使用 synchronized,在 while 循環裡使用 sleep,你再看這個輸出結果

一個Java線程問題,公司的程序員吵翻了

小路:這個不會也輸出 i 的值吧???我運行下

一個Java線程問題,公司的程序員吵翻了

我丟,這是什麼操作???

......

別急,再讓你看 2 個例子,都能輸出結果

① 用 volatile 修飾變量 i,但是不修飾變量 flag

一個Java線程問題,公司的程序員吵翻了

一個Java線程問題,公司的程序員吵翻了

② 使用包裝類型 Integer 修飾變量 i

一個Java線程問題,公司的程序員吵翻了

一個Java線程問題,公司的程序員吵翻了

你品,你品,你細品。


一個Java線程問題,公司的程序員吵翻了

如果你知道啥情況的,你倒是說啊!


歡迎關注@Python大星,一個會點 Python 的 Java 程序員。

@Python大星 | 文


分享到:


相關文章: