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

java volatile案例講解

 更新時(shí)間:2021年07月01日 10:19:07   作者:我的心里只有你  
這篇文章主要介紹了java volatile案例講解,本文通過(guò)講解內(nèi)存可見(jiàn)性,Volatile變量來(lái)去詳細(xì)分析該項(xiàng)概念,需要的朋友可以參考下

本篇來(lái)自java并發(fā)編程實(shí)戰(zhàn)關(guān)于volatile的總結(jié)。

要說(shuō)volatile,先得明白內(nèi)存可見(jiàn)性。那我們就從內(nèi)存可見(jiàn)性說(shuō)起。

一、內(nèi)存可見(jiàn)性

可見(jiàn)性是一種復(fù)雜的屬性,因?yàn)榭梢?jiàn)性中的錯(cuò)誤總是會(huì)違背我們的直覺(jué)。在單線(xiàn)程環(huán)境中,如果向某個(gè)變量先寫(xiě)入值,然后在沒(méi)有其他寫(xiě)入操作的情況下讀取這個(gè)變量,那么總能得到相同的值。這看起來(lái)很自然。然而,當(dāng)讀操作和寫(xiě)操作在不同的線(xiàn)程中執(zhí)行時(shí),情況卻并非如此,這聽(tīng)起來(lái)或許有些難以接受。通常,我們無(wú)法確保執(zhí)行讀操作的線(xiàn)程能適時(shí)地看到其他線(xiàn)程寫(xiě)入的值,有時(shí)甚至是根本不可能的事情。為了確保多個(gè)想成之間對(duì)內(nèi)存寫(xiě)入操作的可見(jiàn)性,必須使用同步機(jī)制。 對(duì)于以下代碼:

public class NoVisibility {
    private static boolean ready;
    private static int number;
    
    private static class ReaderThread extends Thread{
        public void run(){
            while(!ready)
                Thread.yield();
            System.out.println(number);
        }
    }
    
    public static void main(String[] args){
        new ReaderThread().start();
        number = 42;
        ready = true;
    }
}

NoVisibility可能會(huì)持續(xù)循環(huán)下去,因?yàn)樽x線(xiàn)程可能永遠(yuǎn)都看不到ready的值。一種更奇怪的現(xiàn)象是,Novisibility可能會(huì)輸出0,因?yàn)樽x線(xiàn)程可能看到了寫(xiě)入ready的值,但卻沒(méi)有看到之后寫(xiě)入number的值,這種現(xiàn)象被稱(chēng)為“重排序(Reordering)“。只要在某個(gè)線(xiàn)程中無(wú)法檢測(cè)到重排序情況,(即使在其他線(xiàn)程中可以很明顯地看到該線(xiàn)程中的重排序),那么就無(wú)法確保線(xiàn)程中的操作將按照程序中指定的順序來(lái)執(zhí)行。當(dāng)主線(xiàn)程首先寫(xiě)入number,然后在沒(méi)有同步的情況下寫(xiě)入ready,那么讀線(xiàn)程看到的順序可能與寫(xiě)入的順序完全相反。

在沒(méi)有同步的情況下,編譯器、處理器以及運(yùn)行時(shí)等都可能對(duì)操作的執(zhí)行順序進(jìn)行一些意想不到的調(diào)整。在缺乏足夠同步的多線(xiàn)程程序中,要相對(duì)內(nèi)存操作的執(zhí)行順序進(jìn)行判斷,幾乎無(wú)法得出正確的結(jié)論。

這看上去似乎是一種失敗的設(shè)計(jì),但卻能使JVM充分地利用現(xiàn)代多核處理器的強(qiáng)大性能。例如,在缺少同步的情況下,java內(nèi)存模型允許編譯器對(duì)操作順序進(jìn)行重排序,并將數(shù)值緩存在寄存器中。此外,它還允許CPU對(duì)操作順序進(jìn)行重排序,并將數(shù)值環(huán)迅在處理器特定的緩存中。

二、Volatile變量

java語(yǔ)言提供了一種稍弱的同步機(jī)制,即volatile變量,用來(lái)確保將變量的更新操作通知到其他線(xiàn)程。當(dāng)把變量聲明為volatile類(lèi)型后,編譯器與運(yùn)行時(shí)都會(huì)注意到這個(gè)變量是共享的,因此不會(huì)將該變量上的操作和其他內(nèi)存操作一起重排序。volatile變量不會(huì)被緩存在寄存器或者對(duì)其他處理器不可見(jiàn)的地方,因此在讀取volatile類(lèi)型的變量時(shí)總會(huì)返回最新寫(xiě)入的值。

volatile與加鎖機(jī)制的區(qū)別:

加鎖機(jī)制既可以確??梢?jiàn)性又可以確保原子性,而volatile變量只能確??梢?jiàn)性。

 當(dāng)且僅當(dāng)滿(mǎn)足以下所有條件時(shí),才應(yīng)該使用volatile變量:

  1. 對(duì)變量的寫(xiě)入操作不依賴(lài)變量的當(dāng)前值,或者你能確保只有單個(gè)線(xiàn)程更新變量的值。
  2. 該變量不會(huì)與其他狀態(tài)變量一起納入不變性條件中。
  3. 在訪問(wèn)變量時(shí)不需要加鎖。

到此這篇關(guān)于java volatile案例講解的文章就介紹到這了,更多相關(guān)Java volatile內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java單機(jī)接口限流處理方案詳解

    java單機(jī)接口限流處理方案詳解

    這篇文章主要為大家詳細(xì)介紹了java單機(jī)接口限流處理方案,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • java實(shí)現(xiàn)讀取jar包中配置文件的幾種方式

    java實(shí)現(xiàn)讀取jar包中配置文件的幾種方式

    本文主要介紹了java實(shí)現(xiàn)讀取jar包中配置文件的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • java后臺(tái)實(shí)現(xiàn)支付寶對(duì)賬功能的示例代碼

    java后臺(tái)實(shí)現(xiàn)支付寶對(duì)賬功能的示例代碼

    這篇文章主要介紹了java后臺(tái)實(shí)現(xiàn)支付寶對(duì)賬功能的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • Spring batch批處理框架

    Spring batch批處理框架

    本文主要介紹了Spring batch批處理框架的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-04-04
  • Java連接數(shù)據(jù)庫(kù),及增刪改查的示例

    Java連接數(shù)據(jù)庫(kù),及增刪改查的示例

    這篇文章主要介紹了Java連接數(shù)據(jù)庫(kù),及增刪改查的示例,幫助大家更好的利用Java處理數(shù)據(jù),感興趣的朋友可以了解下
    2020-10-10
  • 基于SSM實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    基于SSM實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于SSM實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Netty分布式編碼器及寫(xiě)數(shù)據(jù)事件處理使用場(chǎng)景

    Netty分布式編碼器及寫(xiě)數(shù)據(jù)事件處理使用場(chǎng)景

    這篇文章主要為大家介紹了Netty分布式編碼器及寫(xiě)數(shù)據(jù)事件處理使用場(chǎng)景剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,
    2022-03-03
  • Java double轉(zhuǎn)BigDecimal的注意事項(xiàng)說(shuō)明

    Java double轉(zhuǎn)BigDecimal的注意事項(xiàng)說(shuō)明

    這篇文章主要介紹了Java double轉(zhuǎn)BigDecimal的注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • java如何實(shí)現(xiàn)字符串中的字母排序

    java如何實(shí)現(xiàn)字符串中的字母排序

    這篇文章主要介紹了java如何實(shí)現(xiàn)字符串中的字母排序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 使用Spring自定義命名空間

    使用Spring自定義命名空間

    這篇文章主要介紹了使用Spring自定義命名空間方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論