JMM(Java Memory Model) 是 Java 平臺(tái)的內(nèi)存模型,它規(guī)定了多線程訪問(wèn)共享數(shù)據(jù)時(shí)的行為,并確保了在不同的 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 沒(méi)有加同步鎖,所以在多線程的情況下可能出現(xiàn)問(wèn)題。如果 JVM 使用的是弱內(nèi)存模型,那么輸出的結(jié)果可能是 0,在強(qiáng)內(nèi)存模型下結(jié)果一定是 1。
Java 運(yùn)行時(shí)數(shù)據(jù)區(qū)包括線程私有區(qū)和線程共享區(qū)。線程私有區(qū)包括程序計(jì)數(shù)器、Java 虛擬機(jī)棧和本地方法棧;線程共享區(qū)包括堆、方法區(qū)。
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 是一個(gè)靜態(tài)變量,被所有線程共享,存儲(chǔ)在方法區(qū);address 和 age 是在 main 方法中定義的局部變量,存儲(chǔ)在 Java 虛擬機(jī)棧中,只有當(dāng)前線程可以訪問(wèn)。