廢話不多說,直接上題
先看下圖 1 中的代碼,並思考下程序輸出情況?
圖1 輸出情況是怎樣? 單選
0
人0%
A.死循環
0
人0%
B.打印 i 的值
同事小鹿:Are you kidding me ? 根據 JMM(Java 內存模型) ,flag 一直為 false,程序會進入死循環。
你自己運行下。
......
我丟,這輸出結果,咋回事???
小路:我發現 while 循環體去掉第 22 行:
System.out.println("flag = " + flag);
程序會進入死循環,難道是由於 system 中有 synchronized 導致,但是主線程也不是馬上就能讀取到 flag 的最新值。
小路,先不急,我不用 system,沒有使用 synchronized,在 while 循環裡使用 sleep,你再看這個輸出結果
小路:這個不會也輸出 i 的值吧???我運行下
我丟,這是什麼操作???
......
別急,再讓你看 2 個例子,都能輸出結果
① 用 volatile 修飾變量 i,但是不修飾變量 flag
② 使用包裝類型 Integer 修飾變量 i
你品,你品,你細品。
如果你知道啥情況的,你倒是說啊!
歡迎關注@Python大星,一個會點 Python 的 Java 程序員。
@Python大星 | 文