JMM如何解決順序一致性問題 重排序問題

2021-10-12 17:48:01 字數 758 閱讀 2303

為了提高程式的執行效能,編譯器和處理器都會對指令做重排序,其中處理器的重排序在前面已經分析過了。所謂的重排序其實就是指執行的指令順序。 

編譯器的重排序指的是程式編寫的指令在編譯之後,指令可能會產生重排序來優化程式的執行效能。

從源**到最終執行的指令,可能會經過三種重排序。

2和3屬於處理器重排序。這些重排序可能會導致可見性問題。

編譯器的重排序,jmm提供了禁止特定型別的編譯器重排序。

處理器重排序,jmm會要求編譯器生成指令時,會插入記憶體屏障來禁止處理器重排序

當然並不是所有的程式都會出現重排序問題

編譯器的重排序和cpu的重排序的原則一樣,會遵守資料依賴性原則,編譯器和處理器不會改變存在資料依賴關係的兩個操作的執行順序,比如下面的**,

a=1; b=a; 

a=1;a=2; 

a=b;b=1;

這三種情況在單執行緒裡面如果改變**的執行順序,都會導致結果不一致,所以重排序不會對這類的指令做優化。這種規則也成為as-if-serial。不管怎麼重排序,對於單個執行緒來說執行結果不能改變。比如

int a=2; //1 

int b=3; //2 

int rs=a*b; //3 

1和3、2和3存在資料依賴,所以在最終執行的指令中,3不能重排序到1和2之前,否則程式會報錯。由於1和2不存在資料依賴,所以可以重新排列1和2的順序

快取一致性問題怎麼解決

關於 redis 的其他的一些面試問題已經寫過了,比如常見的快取穿透 雪崩 擊穿 熱點的問題,但是還有乙個比較麻煩的問題就是如何保證快取一致性。對於快取和資料庫的操作,主要有以下兩種方式。先刪除快取,資料庫還沒有更新成功,此時如果讀取快取,快取不存在,去資料庫中讀取到的是舊值,快取不一致發生。延時雙...

併發一致性問題

常見併發併發一致性問題包括 丟失的修改 不可重複讀 讀髒資料 幻影讀 幻影讀在一些資料中往往與不可重複讀歸為一類 2.2.1.1 丟失修改 下面我們先來看乙個例子,說明併發操作帶來的資料的不一致性問題。考慮飛機訂票系統中的乙個活動序列 甲售票點 甲事務 讀出某航班的機票餘額a,設a 16.乙售票點 ...

Session一致性問題

1 什麼是session session在網路應用上表示 會話控制 用於儲存特定使用者會話所需的屬性及配置資訊 session又表示乙個特定的時間間隔,指從登入進入系統到登出退出系統之間所經過的時間。http是無狀態的協議,在動態web應用中,往往需要知道前面的操作和後面的操作是不是乙個使用者。也就...