一文讀懂Java多線(xiàn)程并發(fā)之內存模型

admin2024-06-21  15

 什么是內存模型?

Java內存模型(Java Memory Model)描述了Java編程語(yǔ)言中的線(xiàn)程如何與內存進(jìn)行交互,是和多線(xiàn)程相關(guān)的一組規范,需要各個(gè) JVM 的實(shí)現來(lái)遵守 JMM 規范,以便于開(kāi)發(fā)者可以利用這些規范,更方便地開(kāi)發(fā)多線(xiàn)程程序。有了這些規范,即便同一個(gè)程序在不同操作系統的虛擬機上運行,得到的程序結果也是一致的。如果沒(méi)有這些規范,不同操作系統的虛擬機對相同關(guān)鍵字的解釋不一致,這是不可接受的。JMM旨在解決 CPU 多級緩存、處理器優(yōu)化、指令重排等導致的結果不可預期的問(wèn)題。

特別注意一點(diǎn),Java內存模型是與多線(xiàn)程并發(fā)相關(guān)的規范,不是JVM內存結構。JVM內存結構講的是JVM如何劃分運行時(shí)內存區域,比如虛擬機規范將內存區域劃分為堆區、方法區、虛擬機棧、本地方法棧、程序計數器五個(gè)區域。不同虛擬機可能在實(shí)現上會(huì )略有不同,但總體是按規范實(shí)現的。比如Hotspot虛擬機棧和本地方法棧是合并實(shí)現的,JDK8方法區用元空間來(lái)實(shí)現,但JDK7以下則可能是永久代來(lái)實(shí)現。

內存模型是同步關(guān)鍵字原理

在Java程序中,volatile、synchronized、Lock等同步關(guān)鍵字或鎖工具類(lèi)其實(shí)現原理都涉及JMM規范,或說(shuō)它們就是遵循JMM規范來(lái)實(shí)現的。

比如說(shuō),我們使用volatile來(lái)修飾一個(gè)共享變量,那么這個(gè)變量在多線(xiàn)程環(huán)境下,數據變更會(huì )立刻從工作內存刷新回主內存以確保變量的可見(jiàn)性。同時(shí),被volatile來(lái)修飾的變量也會(huì )禁止指令重排序。synchronized也有同樣的效果,保證可見(jiàn)性,禁止指令重排序,同時(shí)會(huì )變量添加monitor對象鎖,多個(gè)線(xiàn)程訪(fǎng)問(wèn)被synchronized修飾的變量只能等其它線(xiàn)程釋放鎖才能訪(fǎng)問(wèn)此變量。因此,synchronized能保證變量的線(xiàn)程安全,相當于將變量的讀寫(xiě)串行化了,因此能保證變量的線(xiàn)程安全。

JMM最重要的三個(gè)東西上面基本都已提及,即原子性、可見(jiàn)性與指令重排序。下面我們詳細了解下這幾方面的內容。

什么是原子性?

在介紹Java線(xiàn)程的文章中也有提及,這里再次拿出來(lái)講述一下。具備原子性的操作被稱(chēng)為原子操作,原子操作可以認為是一個(gè)或一組不可分割的操作,操作要么做完了,要么就都不做,不存在只做一半的情況,原子性意味著(zhù)不可分割。編程界經(jīng)典操作,i++,這句代碼看似只有一句代碼,好像很原子了,實(shí)際則不然。下面例子你覺(jué)得會(huì )打印1還是0?

public class AddTest3 {

    private static int i
本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲空間服務(wù),不擁有所有權,不承擔相關(guān)法律責任。如若轉載,請注明原文出處。如若內容造成侵權/違法違規/事實(shí)不符,請聯(lián)系SD編程學(xué)習網(wǎng):675289112@qq.com進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!
一级毛片在线一区二区-亚洲精品无码专区土豆网在线播放-亚洲无乱码一区二区三区-亚洲一区二区三区精品