public class Demo {
private static int i = 10;
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
i++;
i++;
}
}).run(); // 錯誤:直接呼叫 run()
System.out.println(i);
}
}
Thread.start():啟動新線程,由 JVM 排程執行 run()。Thread.run():單純方法呼叫,在當前主線程中同步執行,不會開啟新線程。new Thread(...).run()。run() 方法體。i++ 兩次,i 從 10 變為 12。run() 返回,繼續執行 System.out.println(i),輸出 12。new Thread(() -> {
i++;
i++;
}).start(); // 必須呼叫 start()
// 若需等待子線程結束再輸出
Thread t = new Thread(() -> { i++; i++; });
t.start();
t.join(); // 主線程阻塞等待
System.out.println(i); // 此時才能保証看到 12(但順序已無意義)
即使改用 start(),i++ 非原子操作(讀取-修改-寫入),多線程並發會導致資料競爭。解決方案:
AtomicInteger:AtomicInteger i = new AtomicInteger(10); i.incrementAndGet();synchronized 關鍵字鎖定關鍵區段。volatile 僅保證可見性,不保證原子性,不適用於 i++。run() 是普通方法,start() 才是開啟線程的鑰匙。初學者最易混淆的「以為呼叫 run 就能多線程」,請牢記:**新線程從 start() 開始,而非 run()**。