欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java那些鮮為人知的關(guān)鍵字volatile詳析

 更新時(shí)間:2021年03月05日 10:16:48   作者:Carson_Ho  
這篇文章主要給大家介紹了關(guān)于Java那些鮮為人知的關(guān)鍵字volatile的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

在Java中,Java中volatile關(guān)鍵字十分重要

本文全面 & 詳細(xì)解析volatile關(guān)鍵字,希望你們會喜歡

目錄

1. 定義

Java 中的1個(gè)關(guān)鍵字 / 修飾符

2. 作用

保證 被 volatile修飾的共享變量 的可見性 & 有序性,但不保證原子性

3. 具體描述

下面,我將詳細(xì)講解 volatile是如何保證 “共享變量 的可見性 & 有序性,但不保證原子性”的具體原理

儲備知識:原子性、可見性 & 有序性

3.1 保證可見性

具體描述

volatile修飾的屬性保證每次讀取都能讀到最新的值

但不會 & 無法更新已經(jīng)讀了的值

原理

線程A在工作內(nèi)存中修改的共享屬性值會立即刷新到主存,線程B/C/D每次通過讀寫柵欄來達(dá)到類似于直接從主存中讀取屬性值

只是類似,網(wǎng)上有些說volatile修飾的變量讀寫直接在主存中操作,這種說法是不對的,只是表現(xiàn)出類似的行為

讀寫柵欄是一條CPU指令;插入一個(gè)讀寫柵欄 = 告訴CPU & 編譯器先于這個(gè)命令的必須先執(zhí)行,后于這個(gè)命令的必須后執(zhí)行(有序性)

讀寫柵欄另一個(gè)作用是強(qiáng)制更新一次不同CPU的緩存。例如,一個(gè)寫柵欄會 把這個(gè)柵欄前寫入的數(shù)據(jù)刷新到緩存,以此保證可見性

3.2 保證有序性

具體描述

當(dāng)對volatile修飾的屬性進(jìn)行讀/寫操作時(shí),其前面的代碼必須已執(zhí)行完成 & 結(jié)果對后續(xù)的操作可見

原理

重排序時(shí),以volatile修飾屬性的讀/寫操作代碼行為分界線,讀/寫操作前面的代碼不許排序到后面,后面同理不許排序到前面。由此保證有序性

3.3 不保證原子性

具體描述

volatile修飾的屬性若在修改前已讀取了值,那么修改后,無法改變已經(jīng)復(fù)制到工作內(nèi)存的值

即無法阻止并發(fā)的情況

原理

// 變量a 被volatile修飾 
volatile static int a=0;
a++;
// 包含了2步操作:1 = 讀取a、2= 執(zhí)行a+1 & 將a+1結(jié)果賦值給a
// 設(shè):線程A、B同時(shí)執(zhí)行以下語句,線程A執(zhí)行完第1步后被掛起、線程B執(zhí)行了a++,那么主存中a的值為1
// 但線程A的工作內(nèi)存中還是0,由于線程A之前已讀取了a的值 = 0,執(zhí)行a++后再次將a的值刷新到主存 = 1
// 即 a++執(zhí)行了2次,但2次都是從0變?yōu)?,故a的值最終為1

4. 應(yīng)用場

由于volatile保證可見性和有序性,被volatile修飾的共享屬性一般并發(fā)讀/寫沒有問題,可看做是一種輕量級的synchronized實(shí)現(xiàn)

關(guān)于synchronized的講解具體請看文章:Java:這是一份全面 & 詳細(xì)的 Synchronized關(guān)鍵字 學(xué)習(xí)指南

至此,關(guān)于Java中的volatile關(guān)鍵字講解完畢。

5. 總結(jié)

本文主要講解了Java中volatile關(guān)鍵字,其作用為 保證 “共享變量 的可見性 & 有序性,具體總結(jié)如下:

到此這篇關(guān)于Java那些鮮為人知的關(guān)鍵字volatile的文章就介紹到這了,更多相關(guān)Java關(guān)鍵字volatile內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Feign實(shí)現(xiàn)微服務(wù)間文件傳輸

    使用Feign實(shí)現(xiàn)微服務(wù)間文件傳輸

    這篇文章主要為大家詳細(xì)介紹了使用Feign實(shí)現(xiàn)微服務(wù)間文件傳輸,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Java課設(shè)案例之百行代碼實(shí)現(xiàn)簡易計(jì)算器

    Java課設(shè)案例之百行代碼實(shí)現(xiàn)簡易計(jì)算器

    下面這篇文章主要給大家介紹了關(guān)于Java課設(shè)案例之百行代碼實(shí)現(xiàn)簡易計(jì)算器的相關(guān)資料,這是一個(gè)關(guān)于java簡單計(jì)算器的完整課程設(shè)計(jì)以及源碼,需要的朋友可以參考下
    2023-06-06
  • java類和對象原理與用法分析

    java類和對象原理與用法分析

    這篇文章主要介紹了java類和對象原理與用法,結(jié)合實(shí)例形式分析了java類和對象的相關(guān)概念、功能、原理、使用技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • java實(shí)現(xiàn)省市區(qū)轉(zhuǎn)換成樹形結(jié)構(gòu)

    java實(shí)現(xiàn)省市區(qū)轉(zhuǎn)換成樹形結(jié)構(gòu)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)省市區(qū)轉(zhuǎn)換成樹形結(jié)構(gòu),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 一文解讀Spring Bean的生命周期

    一文解讀Spring Bean的生命周期

    這篇文章主要給大家詳細(xì)解讀Spring Bean的生命周期,文中有詳細(xì)的代碼示例,對我們學(xué)習(xí)Spring Bean的生命周期有一定的幫助,感興趣的同學(xué)跟著小編一起來學(xué)習(xí)吧
    2023-07-07
  • Java如何獲取相對路徑文件

    Java如何獲取相對路徑文件

    這篇文章主要介紹了Java如何獲取相對路徑文件問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 關(guān)于java中自定義注解的使用

    關(guān)于java中自定義注解的使用

    這篇文章主要介紹了關(guān)于java中自定義注解的使用,注解像一種修飾符一樣,應(yīng)用于包、類型、構(gòu)造方法、方法、成員變量、參數(shù)及本地變量的聲明語句中,需要的朋友可以參考下
    2023-07-07
  • 學(xué)習(xí)Java之IO流的基礎(chǔ)概念詳解

    學(xué)習(xí)Java之IO流的基礎(chǔ)概念詳解

    這篇文章主要給大家介紹了Java中的IO流,我們首先要搞清楚一件事,就是為什么需要IO流這個(gè)東西,但在正式學(xué)習(xí)IO流的使用之前,小編有必要帶大家先了解一下IO流的基本概念,需要的朋友可以參考下
    2023-09-09
  • Spring Security整合CAS的示例代碼

    Spring Security整合CAS的示例代碼

    本篇文章主要介紹了Spring Security整合CAS的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • Java設(shè)計(jì)模式的事件模型詳解

    Java設(shè)計(jì)模式的事件模型詳解

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式的事件模型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03

最新評論