java之juc二

JMM

請你談談對Volatile的理解

Volatile是jvm提供的輕量級的同步機制(和synchronized差不多,但是沒有synchronized那么強大)

  1. 保證可見性
  2. 不保證原子性
  3. 禁止指令重排

什么是JMM

JMM:java內存模型,不存在的東西,概念!約定!

JMM即為JAVA 內存模型(java memory model)。因為在不同的硬件生產商和不同的操作系統下,內存的訪問邏輯有一定的差異,結果就是當你的代碼在某個系統環境下運行良好,并且線程安全,但是換了個系統就出現各種問題。Java內存模型,就是為了屏蔽系統和硬件的差異,讓一套代碼在不同平臺下能到達相同的訪問結果。JMM從java 5開始的JSR-133發布后,已經成熟和完善起來。

關于JMM的一些同步的約定

  1. 線程解鎖前,必須把共享變量立刻刷回主存。
    主內存中有一個共享變量,假設線程a要操作主內存中的共享變量,它不會直接操作主內存中的共享變量,而是會拷貝一份到線程a的工作內存中,如果線程a修改了自己線程內存中的共享變量,那么在解鎖前需要把更新的共享變量的值賦值給主內存中的共享變量。
  2. 線程加鎖前,必須主存中的最新值到工作內存中。
  3. 加鎖和解鎖是同一把鎖。

線程、工作內存、主內存

在這里插入圖片描述

  1. 從主存中read變量,load到線程的工作內存中,變量就被加載到了線程的工作內存中

  2. 執行引擎Use變量,并assign(返回)。

  3. 將工作內存中的變量write并store到主內存中。

  4. lock和unlock

在這里插入圖片描述
意思就是線程a執行的慢,變量還沒有及時刷新到主存中,線程b就已經更改變量并刷新到了主存中,此時線程a依舊拿著舊的變量,這就出現了問題。

內存交互操作有8種,虛擬機實現必須保證每一個操作都是原子的,不可在分的(對于double和long類型的變量來說,load、store、read和write操作在某些平臺上允許例外)

  • lock (鎖定):作用于主內存的變量,把一個變量標識為線程獨占狀態
  • unlock (解鎖):作用于主內存的變量,它把一個處于鎖定狀態的變量釋放出來,釋放后的變量才可以被其他線程鎖定
  • read (讀取):作用于主內存變量,它把一個變量的值從主內存傳輸到線程的工作內存中,以便隨后的load動作使用
  • load (載入):作用于工作內存的變量,它把read操作從主存中變量放入工作內存中
  • use (使用):作用于工作內存中的變量,它把工作內存中的變量傳輸給執行引擎,每當虛擬機遇到一個需要使用到變量的值,就會使用到這個指令
  • assign (賦值):作用于工作內存中的變量,它把一個從執行引擎中接受到的值放入工作內存的變量副本中
  • store (存儲):作用于主內存中的變量,它把一個從工作內存中一個變量的值傳送到主內存中,以便后續的write使用
  • write  (寫入):作用于主內存中的變量,它把store操作從工作內存中得到的變量的值放入主內存的變量中

JMM對這八種指令的使用,制定了如下規則:

  • 不允許read和load、store和write操作之一單獨出現。即使用了read必須load,使用了store必須write

  • 不允許線程丟棄他最近的assign操作,即工作變量的數據改變了之后,必須告知主存

  • 不允許一個線程將沒有assign的數據從工作內存同步回主內存

  • 一個新的變量必須在主內存中誕生,不允許工作內存直接使用一個未被初始化的變量。就是對變量實施use、store操作之前,必須經過assign和load操作

  • 一個變量同一時間只有一個線程能對其進行lock。多次lock后,必須執行相同次數的unlock才能解鎖

  • 如果對一個變量進行lock操作,會清空所有工作內存中此變量的值,在執行引擎使用這個變量前,必須重新load或assign操作初始化變量的值

  • 如果一個變量沒有被lock,就不能對其進行unlock操作。也不能unlock一個被其他線程鎖住的變量

  • 對一個變量進行unlock操作之前,必須把此變量同步回主內存

部分內容轉載自:
https://www.cnblogs.com/null-qige/p/9481900.html

華為員工中患憂郁癥、焦慮癥的不斷增多,令人十分擔心。有什么辦法可以讓員工積極、開放、正派地面對人生?我思考再三,不得其解。

任正非:要快樂地度過充滿困難的一生

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40226.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40226.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40226.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

常用Linux命令

常用Linux命令 1. 基本命令 uname -m 顯示機器的處理器架構 uname -r 顯示正在使用的內核版本 dmidecode -q 顯示硬件系統部件 (SMBIOS / DMI) hdparm -i /dev/hda 羅列一個磁盤的架構特性 hdparm -tT /dev/sda 在磁盤上執行測試性讀取操作系統信息 arch 顯示機器的處理器架構…

一.RocketMQ概念

RocketMQ概念 1.概念2.應用場景3.MQ的優點和缺點4.常見MQ對比 1.概念 MQ(Message Queue),是一種提供消息隊列服務的中間件,也稱為消息中間件,是一套提供了消息生產、存儲、消費全過程API的軟件系統。 RocketMQ是阿里巴巴2016年MQ中間件&…

Error: Couldn‘t find preset “es2015“ relative to directory

vue引入element-ui,運行時報了這個錯誤 Module build failed: Error: Couldnt find preset "es2015" relative to directory "D:\\360MoveData\\Users\\Administrator\\Desktop\\新建文件夾\\henge-test"at D:\360MoveData\Users\Administrato…

華為云classroom賦能--Devstar使應用開發無需從零開始

華為云DevStar為開發者提供業界主流框架代碼初始化能力,通過GUI、API、CLI等多種方式,將按模板生成框架代碼的能力推送至用戶桌面。同時基于華為云服務資源、成熟的DevOps開發工具鏈和面向多場景的眾多開發模板,提供一站式創建代碼倉、自動生…

Windows server 2016如何安裝OpenSSH

在 Windows Server 2016 上安裝 OpenSSH 需要通過“添加功能和角色”向導來完成。以下是安裝 OpenSSH 的步驟: 1.打開 Windows Server 2016 控制面板。 2.點擊 "程序",然后選擇 "程序和功能"。 3.在左側菜單中,點擊 &…

【golang】數組和切片底層原理

數組類型的值(以下簡稱數組)的長度是固定的,而切片類型的值(以下簡稱切片)是可變長的。 數組的長度在聲明它的時候就必須給定,并且之后不會再改變。可以說,數組的長度是其類型的一部分。比如&a…

Spring學習筆記之Spring IoC注解式開發

文章目錄 聲明Bean的注解Component注解Controller注解Service注解Repository Spring注解的使用選擇性實例化Bean負責注入的注解ValueAutowired與QuaifierResource 全注解式開發 注解的存在主要是為了簡化XML的配置。Spring6倡導全注解開發 注解怎么定義,注解中的屬性…

深入探索JavaEE單體架構、微服務架構與云原生架構

課程鏈接: 鏈接: https://pan.baidu.com/s/1xSI1ofwYXfqOchfwszCZnA?pwd4s99 提取碼: 4s99 復制這段內容后打開百度網盤手機App,操作更方便哦 --來自百度網盤超級會員v4的分享 課程介紹: 🔍【00】模塊零:開營直播&a…

ARM-M0內核MCU,內置24bit ADC,采樣率4KSPS,傳感器、電子秤、體脂秤專用,國產IC

ARM-M0內核MCU 內置24bit ADC ,采樣率4KSPS flash 64KB,SRAM 32KB 適用于傳感器,電子秤,體脂秤等等

[BitSail] Connector開發詳解系列三:SourceReader

更多技術交流、求職機會,歡迎關注字節跳動數據平臺微信公眾號,回復【1】進入官方交流群 Source Connector 本文將主要介紹負責數據讀取的組件SourceReader: SourceReader 每個SourceReader都在獨立的線程中執行,只要我們保證Sou…

Jmeter進階使用:BeanShell實現接口前置和后置操作

一、背景 我們使用Jmeter做壓力測試或者接口測試時,除了最簡單的直接對接口發起請求,很多時候需要對接口進行一些前置操作:比如提前生成測試數據,以及一些后置操作:比如提取接口響應內容中的某個字段的值。舉個最常用…

c語言——拷貝數組

這段代碼是一個簡單的數組拷貝示例。它的功能是將一個原始數組 original 的內容拷貝到另一個數組 copied 中,并輸出兩個數組的元素。 代碼執行過程如下: 首先,在 main() 函數中定義了一個整型數組 original,并初始化了它的元素。…

【ARM 嵌入式 編譯 Makefile 系列 15 - Makefile define 宏與調用宏函數詳細介紹】

文章目錄 Makefile define 宏與調用宏函數帶參數的宏函數帶返回值的宏函數Makefile define 宏與調用宏函數 在Makefile中,可以通過define關鍵字來定義一個多行的宏(也稱為變量)。這種宏定義通常用于定義一個復雜的命令序列,然后在其他地方調用。 以下是定義一個宏的例子:…

物聯網在制造業中的應用

制造業目前正在經歷第四次工業革命,物聯網、人工智能和機器人等技術進步正在推動行業的發展。研究表明,到2024年,全球制造商將在物聯網解決方案上投資700億美元,許多制造商正在實施物聯網設備,以利用預測性維護和復雜的…

接口測試工具——Postman測試工具 Swagger接口測試+SpringBoot整合 JMeter高并發測試工具

目錄 Postman測試工具接口測試工具swaggerKnife4j1.引入依賴2.配置3.常用注解4.接口測試 JMeter什么是JMeter?JMeter安裝配置1.官網下載2.下載后解壓3.漢語設置 JMeter的使用方法1.新建線程組2.設置參數3.添加取樣器4.設置參數:協議,ip,端口…

SDK是什么,SDK和API有什么區別

SDK(Software Development Kit)是一種開發工具包,通常由軟件開發公司或平臺提供,用于幫助開發人員構建、測試和集成特定平臺或軟件的應用程序。SDK 包含一系列的庫、工具、示例代碼和文檔,旨在簡化開發過程并提供所需的…

基于Mysql+Vue+Django的協同過濾和內容推薦算法的智能音樂推薦系統——深度學習算法應用(含全部工程源碼)+數據集

目錄 前言總體設計系統整體結構圖系統流程圖 運行環境Python 環境MySQL環境VUE環境 模塊實現1. 數據請求和儲存2. 數據處理計算歌曲、歌手、用戶相似度計算用戶推薦集 3. 數據存儲與后臺4. 數據展示 系統測試工程源代碼下載其它資料下載 前言 本項目以豐富的網易云音樂數據為基…

SQLSERVER 查詢語句加with (NOLOCK) 報ORDER BY 報錯 除非另外還指定了 TOP、OFFSET 或 FOR XML

最近有一個項目在客戶使用時發現死鎖問題,用的數據庫是SQLSERVER ,死鎖的原因是有的客戶經常去點報表,報表查詢時間又慢,然后又有人在做單導致了死鎖,然后主管要我們用SQLSERVER查詢時要加with (NOLOCK),但是我在加完 …

YOLOv5模型訓練流程

此文章只是記錄使用,以便后續查看,不作為教程,剛接觸,可能有錯誤 YOLOv5模型訓練流程 一、數據集的準備 1.在源碼根目錄新建mydata文件夾,在此文件夾下新建images和labels文件夾 目錄樹如下: ├───…

鏈表---

題目描述 一個學校里老師要將班上 N 個同學排成一列,同學被編號為 1~N,他采取如下的方法: 先將 11 號同學安排進隊列,這時隊列中只有他一個人; 2~N 號同學依次入列,編號為 i 的同學入列方式為&#xff…