更新時(shí)間:2023-03-28 來源:黑馬程序員 瀏覽量:
IT就到黑馬程序員.gif)
Java的內(nèi)存模型定義了Java程序在運(yùn)行時(shí)的內(nèi)存結(jié)構(gòu)以及多線程情況下,多個(gè)線程之間如何共享內(nèi)存。Java的內(nèi)存模型保證了線程安全性,避免了多線程訪問共享內(nèi)存時(shí)出現(xiàn)的數(shù)據(jù)競爭、死鎖等問題。
Java內(nèi)存模型將內(nèi)存分為兩個(gè)部分:線程工作內(nèi)存和主內(nèi)存。線程工作內(nèi)存是線程獨(dú)有的內(nèi)存空間,用于存儲(chǔ)線程運(yùn)行時(shí)的局部變量等數(shù)據(jù),而主內(nèi)存是所有線程共享的內(nèi)存空間,用于存儲(chǔ)Java程序中定義的全局變量等數(shù)據(jù)。
Java內(nèi)存模型定義了一組規(guī)則,確保多個(gè)線程之間對(duì)共享內(nèi)存的訪問是正確的。其中包括:
·可見性:當(dāng)一個(gè)線程修改了共享變量的值后,其他線程可以立即看到該變量的修改。
·原子性:對(duì)共享變量的讀寫操作應(yīng)該被視為一個(gè)原子操作,不可被中斷。
存模型?.jpg)
·有序性:線程之間的操作可能會(huì)被編譯器、處理器進(jìn)行指令重排等優(yōu)化,但是Java內(nèi)存模型保證了操作執(zhí)行的順序不會(huì)影響程序的正確性。
我們用一個(gè)簡單的代碼示例,展示了Java內(nèi)存模型的可見性特性:
public class Main {
private static boolean flag = false;
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
while (!flag) { // 線程1不斷檢查flag的值
// do nothing
}
System.out.println("Thread 1 finished");
}).start();
Thread.sleep(1000);
flag = true; // 主線程修改flag的值
System.out.println("Main thread finished");
}
}在這個(gè)例子中,程序開啟了兩個(gè)線程,其中線程1不斷檢查flag變量的值,直到它被修改為true。在主線程中,程序在等待了一段時(shí)間后將flag變量的值修改為true。
由于Java內(nèi)存模型的可見性特性,當(dāng)主線程修改flag變量的值時(shí),線程1應(yīng)該能夠立即看到flag的值已經(jīng)被修改為true,于是線程1退出循環(huán)并打印出"Thread 1 finished",然后程序結(jié)束。
1024首播|39歲程序員逆襲記:不被年齡定義,AI浪潮里再迎春天
2025-10-241024程序員節(jié)丨10年同行,致敬用代碼改變世界的你
2025-10-24【AI設(shè)計(jì)】北京143期畢業(yè)僅36天,全員拿下高薪offer!黑馬AI設(shè)計(jì)連續(xù)6期100%高薪就業(yè)
2025-09-19【跨境電商運(yùn)營】深圳跨境電商運(yùn)營畢業(yè)22個(gè)工作日,就業(yè)率91%+,最高薪資達(dá)13500元
2025-09-19【AI運(yùn)維】鄭州運(yùn)維1期就業(yè)班,畢業(yè)14個(gè)工作日,班級(jí)93%同學(xué)已拿到Offer, 一線均薪資 1W+
2025-09-19【AI鴻蒙開發(fā)】上海校區(qū)AI鴻蒙開發(fā)4期5期,距離畢業(yè)21天,就業(yè)率91%,平均薪資14046元
2025-09-19