最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java多線程Synchronized實現(xiàn)可見性原理解析

 更新時間:2021年12月02日 17:11:24   作者:陽光下的米雪  
這篇文章主要介紹了java多線程Synchronized實現(xiàn)可見性原理,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

Synchronized實現(xiàn)可見性原理

可見性

要實現(xiàn)共享變量的可見性,必須保證兩點:

  • 線程修改后的共享變量值能夠及時從工作內(nèi)存刷新到主內(nèi)存中
  • 其他線程能夠及時把共享變量的最新值從主內(nèi)存更新到自己的工作內(nèi)存中

Java語言層面支持的可見性的實現(xiàn)方式

  • synchronized
  • volatile

synchronized實現(xiàn)可見性

synchronized能夠?qū)崿F(xiàn):

  • 原子性(同步)
  • 可見性

JMM關(guān)于synchronized的兩條規(guī)定:

  • 1.線程解鎖前,必須把貢獻變量的最新值刷新到主內(nèi)存中
  • ?2.線程加鎖時,將清空工作內(nèi)存中共享變量的值,從而使用共享變量時需要從主內(nèi)存中重新讀取最新的值(注意:加鎖與解鎖需要同一把鎖)

線程解鎖前對共享變量的修改在下次加鎖時對其他線程可見

線程執(zhí)行互斥代碼的過程

  • 獲取互斥鎖
  • 清空工作內(nèi)存
  • 從主內(nèi)存拷貝變量的最新副本到工作內(nèi)存
  • 執(zhí)行代碼
  • 將更改后的共享變量的值刷新到主內(nèi)存
  • 釋放互斥鎖

重排序:

代碼書寫的順序與實際執(zhí)行的順序不同,指令重排序是編譯器或處理器為了提高程序性能而做得優(yōu)化

  • 編譯器優(yōu)化的重排序(編譯器優(yōu)化)
  • 指令級并行重排序(處理器優(yōu)化)
  • 內(nèi)存系統(tǒng)的重排序(處理器優(yōu)化)

在這里插入圖片描述

as-if-serial

as-if-serial:無論如何重排序,程序執(zhí)行的結(jié)果應(yīng)該與代碼順序執(zhí)行的結(jié)果一致(Java編譯器、運行時和處理器都會保證Java在單線程下遵循as-if-serial語義)

在這里插入圖片描述

public class SynchronizedTest {
    /**
     * 共享變量
     */
    private boolean ready = false;
    private int result = 0;
    private int number = 1;

    /**
     * 寫操作
     */
    public void write(){
        ready = true;//1.1
        number = 2;//1.2
    }
    /**
     * 讀操作
     */
    public void read(){
        if(ready){//2.1
            result=number*3;//2.2
        }
        System.out.println("result的值為:"+result);
    }
    /**
     * 內(nèi)部線程類
     */
    private class ReadWriteThread extends Thread{
        //根據(jù)構(gòu)造方法中傳入的flag參數(shù),確定線程執(zhí)行讀操作還是寫操作
        private boolean flag;
        public ReadWriteThread(boolean flag){
            this.flag=flag;
        }

        @Override
        public void run() {
            if(flag){
                //構(gòu)造方法中傳入true,執(zhí)行寫操作
                write();
            }else{
                //構(gòu)造方法中傳入false,執(zhí)行讀操作
                read();
            }
        }
    }

    public static void main(String[] args) {
        SynchronizedTest synchronizedTest = new SynchronizedTest();
        //啟動線程執(zhí)行寫操作
        synchronizedTest.new ReadWriteThread(true).start();
        //啟動線程執(zhí)行讀操作
        synchronizedTest.new ReadWriteThread(false).start();
    }
}

導(dǎo)致共享變量在線程間不可見的原因

1.線程的交叉執(zhí)行
eg:上述程序執(zhí)行步驟為1.1-》2.1-》2.2-》1.2

在這里插入圖片描述

eg:上述程序執(zhí)行步驟為1.2-》2.1-》2.2-》1.1

在這里插入圖片描述

2.重排序結(jié)合線程交叉執(zhí)行
eg: 2.1和2.2重排序后

int mid = number*3;
if(ready){
	result=mid;
}

共享變量更新后的值沒有在工作內(nèi)存與主內(nèi)存間及時更新

安全性代碼

public class SynchronizedTest {
    /**
     * 共享變量
     */
    private boolean ready = false;
    private int result = 0;
    private int number = 1;

    /**
     * 寫操作
     */
    public synchronized void write(){
        ready = true;//1.1
        number = 2;//1.2
    }
    /**
     * 讀操作
     */
    public synchronized void read(){
        if(ready){//2.1
            result=number*3;//2.2
        }
        System.out.println("result的值為:"+result);
    }
    /**
     * 內(nèi)部線程類
     */
    private class ReadWriteThread extends Thread{
        //根據(jù)構(gòu)造方法中傳入的flag參數(shù),確定線程執(zhí)行讀操作還是寫操作
        private boolean flag;
        public ReadWriteThread(boolean flag){
            this.flag=flag;
        }

        @Override
        public void run() {
            if(flag){
                //構(gòu)造方法中傳入true,執(zhí)行寫操作
                write();
            }else{
                //構(gòu)造方法中傳入false,執(zhí)行讀操作
                read();
            }
        }
    }

    public static void main(String[] args) {
        SynchronizedTest synchronizedTest = new SynchronizedTest();
        //啟動線程執(zhí)行寫操作
        synchronizedTest.new ReadWriteThread(true).start();
        //啟動線程執(zhí)行讀操作
        synchronizedTest.new ReadWriteThread(false).start();
    }
}

在這里插入圖片描述

到此這篇關(guān)于java多線程Synchronized實現(xiàn)可見性原理的文章就介紹到這了,更多相關(guān)java多線程Synchronized內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 哈希表在算法題目中的實際應(yīng)用詳解(Java)

    哈希表在算法題目中的實際應(yīng)用詳解(Java)

    散列表(Hash?table,也叫哈希表)是根據(jù)關(guān)鍵碼值(Key?value)而直接進行訪問的數(shù)據(jù)結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于哈希表在算法題目中的實際應(yīng)用,文中介紹的方法是Java,需要的朋友可以參考下
    2024-03-03
  • java實現(xiàn)table添加右鍵點擊事件監(jiān)聽操作示例

    java實現(xiàn)table添加右鍵點擊事件監(jiān)聽操作示例

    這篇文章主要介紹了java實現(xiàn)table添加右鍵點擊事件監(jiān)聽操作,結(jié)合實例形式分析了Java添加及使用事件監(jiān)聽相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • Maven依賴沖突原因以及解決方法

    Maven依賴沖突原因以及解決方法

    依賴沖突是指項目依賴的某一個 jar 包,有多個不同的版本,因而造成類包版本沖突依賴沖突很經(jīng)常是類包之間的間接依賴引起的,本文將給大家介紹Maven依賴沖突原因以及解決方法,需要的朋友可以參考下
    2023-12-12
  • JDK8中新增的原子性操作類LongAdder詳解

    JDK8中新增的原子性操作類LongAdder詳解

    這篇文章主要給大家介紹了關(guān)于JDK8中新增的原子性操作類LongAdder的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • 深入解析Java中volatile的底層原理

    深入解析Java中volatile的底層原理

    這篇文章主要介紹了深入解析Java中volatile的底層原理,volatile關(guān)鍵字用于保證變量的可見性和禁止指令重排序,即當(dāng)一個線程修改了volatile變量的值,其他線程能夠立即看到這個變量的最新值,而不是使用緩存中的舊值,需要的朋友可以參考下
    2023-07-07
  • Mybatis中#{}和${}傳參的區(qū)別及#和$的區(qū)別小結(jié)

    Mybatis中#{}和${}傳參的區(qū)別及#和$的區(qū)別小結(jié)

    這篇文章主要介紹了Mybatis中#{}和${}傳參的區(qū)別及#和$的區(qū)別小結(jié) 的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • Redis 訂閱發(fā)布_Jedis實現(xiàn)方法

    Redis 訂閱發(fā)布_Jedis實現(xiàn)方法

    下面小編就為大家?guī)硪黄猂edis 訂閱發(fā)布_Jedis實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • spring boot 即時重新啟動(熱更替)使用說明

    spring boot 即時重新啟動(熱更替)使用說明

    這篇文章主要介紹了spring boot 即時重新啟動(熱更替)的相關(guān)資料,需要的朋友可以參考下
    2017-12-12
  • 簡單易用的Spring?Boot郵件發(fā)送demo

    簡單易用的Spring?Boot郵件發(fā)送demo

    本文將介紹如何使用Spring?Boot發(fā)送郵件,我們將演示如何配置SMTP郵件服務(wù)器,創(chuàng)建一個郵件模板,以及如何使用JavaMailSender發(fā)送郵件,我們還將介紹如何測試我們的郵件發(fā)送代碼
    2023-12-12
  • 詳解Java中的Vector

    詳解Java中的Vector

    Vector 可實現(xiàn)自動增長的對象數(shù)組。本文通過實例代碼給大家詳細介紹java中的vector,感興趣的朋友一起看看吧
    2017-10-10

最新評論

哈密市| 大邑县| 梓潼县| 阆中市| 余干县| 绥芬河市| 肇东市| 陕西省| 绵阳市| 任丘市| 肃南| 阳东县| 东山县| 丽水市| 巧家县| 庆云县| 石屏县| 五寨县| 仙居县| 讷河市| 巴彦淖尔市| 建始县| 桓台县| 德安县| 通城县| 芜湖县| 县级市| 宣汉县| 沙河市| 阜康市| 井研县| 奉贤区| 盐津县| 柳河县| 石棉县| 松原市| 恩平市| 麟游县| 孟州市| 富民县| 沙田区|