亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談一下Java中的內(nèi)存模型JMM

 更新時(shí)間:2023年08月11日 09:00:53   作者:劉婉晴  
這篇文章主要介紹了淺談一下Java中的內(nèi)存模型JMM,JMM,全程是?Java?Memory?Model?,直譯就是?Java?內(nèi)存模型,根據(jù)這個(gè)名字,可以知道它是?Java?設(shè)計(jì)用來管理內(nèi)存的一個(gè)模型,需要的朋友可以參考下

一、什么是 JMM

JMM,全程是 Java Memory Model ,直譯就是 Java 內(nèi)存模型。根據(jù)這個(gè)名字,可以知道它是 Java 設(shè)計(jì)用來管理內(nèi)存的一個(gè)模型。

Java 中的內(nèi)存分為主內(nèi)存和本地內(nèi)存,線程之間的共享變量存儲在主內(nèi)存(Main Memory)中,每個(gè)線程都有一個(gè)私有的本地內(nèi)存(Local Memory),本地內(nèi)存中存儲了該線程以讀/寫共享變量的副本。下圖很清晰地闡述了這個(gè)關(guān)系 :

請?zhí)砑訄D片描述

因?yàn)?Java 通過共享內(nèi)存作為線程間的通信機(jī)制,因此 JMM 和線程通信息息相關(guān),可以說 JMM 控制線程的通信,具體來說 JMM 控制一個(gè)線程對共享變量的寫入何時(shí)對另一個(gè)線程可見 。

二、 JMM 基礎(chǔ)

本節(jié)介紹了解 JMM 需要的一些前置知識, 即和 JMM 有關(guān)的一些概念

2.1 Java 線程通信機(jī)制

線程通信機(jī)制一共有兩種(共享內(nèi)存 和 消息傳遞), Java 使用 共享內(nèi)存模型 作為線程同步機(jī)制

2.2 同步

同步是指程序如何控制不同線程操作發(fā)生的相對順序,在多線程并發(fā)情況下,同步是保證多線程下安全問題的非常重要的操作。

2.3 堆內(nèi)存

Java 內(nèi)存有棧內(nèi)存、堆內(nèi)存 和 方法區(qū) 。 堆內(nèi)存中含有線程共享的 實(shí)例、靜態(tài)變量 和 數(shù)組元素等 ,也就是說堆內(nèi)存是線程共享區(qū) 。

2.4 指令重排

正常情況,按照我們的理解,我們寫一段程序在處理器中就是按照我們寫的順序執(zhí)行的 。

但是實(shí)際上,在我們看不到的地方,處理器為了提高執(zhí)行效率,優(yōu)化性能,會對指令進(jìn)行重排 。

以下面的程序?yàn)槔?,解釋指令重排?/p>

int a = 1;  // ....  語句1
int b = 2; // ..... 語句 2

正常情況下, 語句 1 優(yōu)先于 語句 2 執(zhí)行 。

但是,處理器實(shí)際在執(zhí)行時(shí),會根據(jù)情況進(jìn)行處理,可能會出現(xiàn) 語句2 優(yōu)先與 語句1 執(zhí)行的情況。

但是因?yàn)閷Τ绦虻膱?zhí)行結(jié)果沒有影響, 所以,我們程序員不知道發(fā)生了指令重排 。

在單線程情況下,指令重排不影響程序運(yùn)行的結(jié)果。但是多線程情況下,可能會造成影響。

因此, JMM 通過插入 內(nèi)存屏障 禁止特定類型的處理器重排序來保證多線程并發(fā)下的程序執(zhí)行安全 。

2.5 順序一致性模型

順序一致性模型,是 JMM 為保證多線程下的安全而提出的,正確同步的程序應(yīng)該具有順序一致性,其具有如下特點(diǎn):

按照程序順序執(zhí)行,不能重排序操作原子執(zhí)行,對所有線程可見 2.6 同步程序

同步程序并不是完全按照順序一致性執(zhí)行,其在臨界區(qū)內(nèi)可以進(jìn)行重排序,這樣的設(shè)計(jì)給了處理器足夠的優(yōu)化空間,同時(shí)也沒有改變程序的執(zhí)行結(jié)果 。

三、volatile 關(guān)鍵字

3.1 volatile 做什么

volatile 相當(dāng)于同一個(gè)鎖對對該變量的讀寫操作進(jìn)行了同步,用 volatile 修飾的變量總是能被同步到共享內(nèi)存中,避免了因?yàn)楸镜貎?nèi)存的存在導(dǎo)致的線程不安全問題 。volatile 具有如下兩個(gè)特性:

  • 可見性:一個(gè)線程的讀,總是能看到另一個(gè)線程的寫
  • 原子性: 對單個(gè)變量的讀寫具有原子性, 但是對復(fù)合操作不具有原子性

3.2 volatile 原理

3.2.1 規(guī)則

  • 當(dāng)?shù)诙€(gè)操作是volatile寫時(shí),不管第一個(gè)操作是什么,都不能重排序
  • 當(dāng)?shù)谝粋€(gè)操作是volatile讀時(shí),不管第二個(gè)操作是什么,都不能重排序
  • 當(dāng)?shù)谝粋€(gè)操作是volatile寫,第二個(gè)操作是volatile讀時(shí),不能重排序

3.2.2 實(shí)現(xiàn)

生成字節(jié)碼時(shí),會在指令序列中插入內(nèi)存屏障來禁止特定類型的處理器重排序

四、鎖的內(nèi)存語義

  • 鎖釋放與volatile寫有相同的內(nèi)存語義
  • 鎖獲取與volatile讀有相同的內(nèi)存語義

4.1 AQS Java同步器框架

AQS使用一個(gè)整型的volatile變量來維護(hù)同步狀態(tài), 實(shí)現(xiàn) ReentrantLock

4.2 concurrent包

concurrent 包依賴于 CAS 和 volatile 實(shí)現(xiàn)

  • 聲明共享變量為volatile
  • 使用CAS的原子條件更新來實(shí)現(xiàn)線程之間的同步
  • 配合以 volatile 的讀/寫和 CAS 所具有的 volatile 讀和寫的內(nèi)存語義來實(shí)現(xiàn)線程之間的通信

到此這篇關(guān)于淺談一下Java中的內(nèi)存模型JMM的文章就介紹到這了,更多相關(guān)Java內(nèi)存模型JMM內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解maven安裝教程以及解決安裝不成功的解決辦法

    詳解maven安裝教程以及解決安裝不成功的解決辦法

    這篇文章主要介紹了詳解maven安裝教程以及解決安裝不成功的解決辦法,詳細(xì)的介紹了幾種解決方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-12-12
  • java?springboot中如何讀取配置文件的屬性

    java?springboot中如何讀取配置文件的屬性

    大家好,本篇文章主要講的是java?springboot中如何讀取配置文件的屬性,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • SpringBoot返回統(tǒng)一的JSON標(biāo)準(zhǔn)格式實(shí)現(xiàn)步驟

    SpringBoot返回統(tǒng)一的JSON標(biāo)準(zhǔn)格式實(shí)現(xiàn)步驟

    這篇文章主要介紹了SpringBoot返回統(tǒng)一的JSON標(biāo)準(zhǔn)格式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Java如何實(shí)現(xiàn)可折疊Panel方法示例

    Java如何實(shí)現(xiàn)可折疊Panel方法示例

    這篇文章主要給大家介紹了關(guān)于利用Java如何實(shí)現(xiàn)可折疊Panel的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • SpringBoot下載文件遇到文件損壞等問題解決方案

    SpringBoot下載文件遇到文件損壞等問題解決方案

    調(diào)用接口下載spring?boot工程的resources目錄下的excel模板文件,非常常見的一個(gè)文件下載功能,但是卻容易遇到很多坑,下面總結(jié)記錄下
    2023-10-10
  • 一個(gè)注解搞定Spring Security基于Oauth2的SSO單點(diǎn)登錄功能

    一個(gè)注解搞定Spring Security基于Oauth2的SSO單點(diǎn)登錄功能

    本文主要介紹 同域 和 跨域 兩種不同場景單點(diǎn)登錄的實(shí)現(xiàn)原理,并使用 Spring Security 來實(shí)現(xiàn)一個(gè)最簡單的跨域 SSO客戶端。對Spring Security基于Oauth2的SSO單點(diǎn)登錄功能感興趣的朋友一起看看吧
    2021-09-09
  • JavaWeb中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析

    JavaWeb中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析

    這篇文章主要介紹了JavaWeb中struts2文件上傳下載功能的實(shí)現(xiàn),在Web應(yīng)用系統(tǒng)開發(fā)中,文件上傳和下載功能是非常常用的功能,需要的朋友可以參考下
    2016-05-05
  • Java如何有效避免SQL注入漏洞的方法總結(jié)

    Java如何有效避免SQL注入漏洞的方法總結(jié)

    SQL注入是比較常見的網(wǎng)絡(luò)攻擊方式之一,它不是利用操作系統(tǒng)的BUG來實(shí)現(xiàn)攻擊,而是針對程序員編程時(shí)的疏忽,通過SQL語句,實(shí)現(xiàn)無帳號登錄,甚至篡改數(shù)據(jù)庫,這篇文章主要給大家介紹了關(guān)于Java如何避免SQL注入漏洞的兩種方法,需要的朋友可以參考下
    2022-01-01
  • Java實(shí)現(xiàn)遞歸山脈

    Java實(shí)現(xiàn)遞歸山脈

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)遞歸山脈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • java實(shí)現(xiàn)emqx設(shè)備上下線監(jiān)聽詳解

    java實(shí)現(xiàn)emqx設(shè)備上下線監(jiān)聽詳解

    這篇文章主要為大家介紹了java實(shí)現(xiàn)emqx設(shè)備上下線監(jiān)聽詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07

最新評論