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

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

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

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

可見性

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

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

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

  • synchronized
  • volatile

synchronized實(shí)現(xiàn)可見性

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

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

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

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

線程解鎖前對(duì)共享變量的修改在下次加鎖時(shí)對(duì)其他線程可見

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

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

重排序:

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

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

在這里插入圖片描述

as-if-serial

as-if-serial:無論如何重排序,程序執(zhí)行的結(jié)果應(yīng)該與代碼順序執(zhí)行的結(jié)果一致(Java編譯器、運(yùn)行時(shí)和處理器都會(huì)保證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();
        //啟動(dòng)線程執(zhí)行寫操作
        synchronizedTest.new ReadWriteThread(true).start();
        //啟動(dòng)線程執(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)存間及時(shí)更新

安全性代碼

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();
        //啟動(dòng)線程執(zhí)行寫操作
        synchronizedTest.new ReadWriteThread(true).start();
        //啟動(dòng)線程執(zhí)行讀操作
        synchronizedTest.new ReadWriteThread(false).start();
    }
}

在這里插入圖片描述

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

相關(guān)文章

  • Spring計(jì)時(shí)器StopWatch的具體使用

    Spring計(jì)時(shí)器StopWatch的具體使用

    本文主要介紹了Spring計(jì)時(shí)器StopWatch的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 詳解SpringBoot修改啟動(dòng)端口server.port的四種方式

    詳解SpringBoot修改啟動(dòng)端口server.port的四種方式

    這篇文章主要介紹了詳解SpringBoot修改啟動(dòng)端口server.port的四種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java實(shí)現(xiàn)實(shí)時(shí)監(jiān)控目錄下文件變化的方法

    Java實(shí)現(xiàn)實(shí)時(shí)監(jiān)控目錄下文件變化的方法

    今天小編就為大家分享一篇關(guān)于Java實(shí)現(xiàn)實(shí)時(shí)監(jiān)控目錄下文件變化的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 三種Java自定義DNS解析器方法與實(shí)踐

    三種Java自定義DNS解析器方法與實(shí)踐

    這篇文章主要分享三種Java自定義DNS解析器方法與實(shí)踐,對(duì)于高性能的測試機(jī)(54C96G * 3)而言,可任意通過自定義Java DNS解析器來實(shí)現(xiàn)接口請(qǐng)求,下文內(nèi)容的實(shí)現(xiàn),需要的小伙伴可以參考一下
    2022-02-02
  • Java軟件設(shè)計(jì)模式之適配器模式詳解

    Java軟件設(shè)計(jì)模式之適配器模式詳解

    這篇文章主要介紹了Java軟件設(shè)計(jì)模式之適配器模式詳解,適配器模式可分為對(duì)象適配器和類適配器兩種,在對(duì)象適配器模式中,適配器與適配者之間是關(guān)聯(lián)關(guān)系;在類適配器模式中,適配器與適配者之間是繼承(或?qū)崿F(xiàn))關(guān)系,需要的朋友可以參考下
    2023-07-07
  • java讀取大文件簡單實(shí)例

    java讀取大文件簡單實(shí)例

    這篇文章主要介紹了java讀取大文件簡單實(shí)例,有需要的朋友可以參考一下
    2013-12-12
  • Java常用的八種排序算法與代碼實(shí)現(xiàn)

    Java常用的八種排序算法與代碼實(shí)現(xiàn)

    這篇文章主要給給大家分享Java常用的八種排序算法與代碼實(shí)現(xiàn),下面文章將詳細(xì)介紹整個(gè)實(shí)現(xiàn)過程,感興趣的小伙伙伴可以跟著小編一起來學(xué)習(xí),希望對(duì)你有所幫助
    2021-10-10
  • Java設(shè)計(jì)模式之java備忘錄模式詳解

    Java設(shè)計(jì)模式之java備忘錄模式詳解

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之備忘錄模式,簡單說明了備忘錄模式的概念、原理并結(jié)合實(shí)例形式分析了java備忘錄模式的具體定義及使用方法,需要的朋友可以參考下
    2021-09-09
  • Spring Boot整合Mybatis Plus和Swagger2的教程詳解

    Spring Boot整合Mybatis Plus和Swagger2的教程詳解

    這篇文章主要介紹了Spring Boot整合Mybatis Plus和Swagger2的教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • shiro并發(fā)人數(shù)登錄控制的實(shí)現(xiàn)代碼

    shiro并發(fā)人數(shù)登錄控制的實(shí)現(xiàn)代碼

    在做項(xiàng)目中遇到這樣的需求要求每個(gè)賬戶同時(shí)只能有一個(gè)人登錄或幾個(gè)人同時(shí)登錄,如果是同時(shí)登錄的多人,要么不讓后者登錄,要么踢出前者登錄,怎么實(shí)現(xiàn)這樣的功能呢?下面小編給大家?guī)砹藄hiro并發(fā)人數(shù)登錄控制的實(shí)現(xiàn)代碼,一起看看吧
    2017-09-09

最新評(píng)論