JMM(Java Memory Model) 是 Java 平臺的內存模型,它規定了多線程訪問共享數據時的行為,并確保了在不同的 JVM 上的行為一致。
public class JmmExample { private static int num = 0; private static boolean flag = false; public static void main(String[] args) { new Thread(() -> { while (!flag) { Thread.yield(); } System.out.println(num); }).start(); num = 1; flag = true; } }
在上述代碼中,由于 num 和 flag 沒有加同步鎖,所以在多線程的情況下可能出現問題。如果 JVM 使用的是弱內存模型,那么輸出的結果可能是 0,在強內存模型下結果一定是 1。
Java 運行時數據區包括線程私有區和線程共享區。線程私有區包括程序計數器、Java 虛擬機棧和本地方法棧;線程共享區包括堆、方法區。
public class RuntimeDataAreaExample { private static String name = "Alice"; public static void main(String[] args) { String address = "Beijing"; int age = 18; System.out.println(getInfo()); } private static String getInfo() { return "Name: " + name + ", Address: " + address + ", Age: " + age; } }
在上述代碼中,name 是一個靜態變量,被所有線程共享,存儲在方法區;address 和 age 是在 main 方法中定義的局部變量,存儲在 Java 虛擬機棧中,只有當前線程可以訪問。