package volatilex;
public class VolatileMain {
private static boolean flag = false;
public static void main(String[] args) {
new Thread(() -> {
System.out.println("start");
while (!flag) {
}
System.out.println("run end");
}).start();
new Thread(() -> {
System.out.println("init begin");
init();
System.out.println("init end");
}).start();
}
private static void init() {
flag = true;
}
}
列印結果如下
start
init begin
init end
run end
uj5u.com熱心網友回復:
為什么不加上volatile也能可見?uj5u.com熱心網友回復:
這是執行緒的隨機性和代碼的原子性造成的執行緒1列印完start,能保證它會繼續執行while(!flag)嗎?也許剛列印完start,就切換到執行緒2執行了,執行緒2把flag改了,這時又切換到執行緒1繼續執行,那while(!flag)當然就不成立了。
uj5u.com熱心網友回復:
你改成以下再試試private static boolean flag = false;
public static void main(String[] args) {
new Thread(() -> {
System.out.println("start");
while (!flag) {
}
System.out.println("run end");
}).start();
new Thread(() -> {
System.out.println("init begin");
try {Thread.sleep(10);} catch (Exception e) {} //這里睡眠一下,保證執行緒1進入while(!flag)回圈
init();
System.out.println("init end");
}).start();
}
private static void init() {
flag = true;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/74907.html
標籤:Java SE
