亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現在的位置是:首頁 > 技術閱讀 >  三面阿里竟然敗在了volatile關鍵字上

三面阿里竟然敗在了volatile關鍵字上

時間:2024-02-13

今天閑來無事跟同事 大帆 閑聊,

SoWhat:麥叔聽說你偷偷面阿里啦,面的咋樣?


大帆:一面挺簡單的,主要問了一些基本的數據結構跟算法,還問了下  HashMap的十大常見基本問題。我都答案上來了,還問了我JDK7環,幸虧你那個 HashMap環 繪制的牛逼,我答的不錯就讓我準備二面了。


SoWhat:二面類?


大帆:二面問了我一些JVM的問題,問我對于JVM內存模型的理解,還有GC的常見理解,最終還問了我下類加載機制,我看你之前水過這個 JVM系列,就依葫蘆畫瓢答上來了,讓我準備三面。


SoWhat:大帆這波可以啊,三面問的啥啊?


大帆:三面問了我一些CAS、Lock、AQS跟 ConcurrentHashMap 的底層實現什么的,還問了我下 線程池 的七大參數跟四大拒絕策略,以及使用注意事項。我看你水過 并發編程系列,也就答上來了。


Sowhat:厲害啊這是要過的節奏阿!


大帆:過個錘子,三面的這個總監最后竟然問了我下我對volatile的底層原理。你妹的你么水,我就答了一些基本的可見性跟弱原子性,然后我感覺面試官不太滿意啊!


Sowhat:額好吧,那我抓緊再水文寫下個關于volatile的使用。





使用

volatile變量自身具有下列特性相信大家都知道:

?
  1. 可見性。對一個volatile變量的讀,總是能看到(任意線程)對這個volatile變量最后的寫入。
  2. 原子性:對任意單個volatile變量的讀/寫具有原子性,但類似于volatile++這種復合操作不具有原子性。
?

其中第二點可以理解為把對 volatile 變量的單個讀/寫,看成是使用同一個鎖對這些單個讀/寫操作做了同步,就跟下面的SoWhatSynSoWhat功能類似哦。

class SoWhat{
    volatile int i = 0// volatile修飾的變量
    public int getI(){
        return i;// 單個volatile變量的讀
    }
    public  void setI(int j){
        this.i = j; // 單個volatile 變量的寫
    }
    public void inc(){
        i++;//復合多個volatile 變量
    }
}
class SynSoWhat{
     int i = 0;
    public synchronized int getI(){
        return i;
    }
    public  synchronized void setI(int j){
        this.i = j;
    }
    public void inc()// 普通方法調用
        int tmp = getI(); // 調用已同步方法
        tmp = tmp + 1;//普通寫方法
        setI(tmp);// 調用已同步方法
    }
}

寫理解

volatile寫的內存語義如下:

?

當寫一個volatile變量時,JMM會把該線程對應的本地中的共享變量值刷新到主內存。

?
public class VolaSemanteme {
 int a = 0;
 volatile boolean flag = false// 這是重點哦
 public void init() {
  a = 1
  flag = true
  //.......
 }
 public void use() {
  if (flag) { 
   int i = a * a; 
  }
  //.......
 }
}

線程A調用init方法,線程B調用use方法。

讀理解

volatile讀的內存語義如下:

?

當讀一個volatile變量時,JMM會把該線程對應的本地內存置為無效。線程接下來將從主內存中讀取共享變量。

?
public class VolaSemanteme {
 int a = 0;
 volatile boolean flag = false// 這是重點哦
 public void init() {
  a = 1
  flag = true
  //.......
 }
 public void use() {
  if (flag) { 
   int i = a * a; 
  }
  //.......
 }
}

流程圖大致是這樣的:

volatile 指令重排

volatile 變量的內存可見性是基于內存屏障(Memory Barrier)實現。關于內存屏障的具體講解以前寫過不再重復,JMM裝逼于無形這里說過。總結來說就是JMM內部會有指令重排,并且會有af-if-serialhappen-before的理念來保證指令重拍的正確性。內存屏障就是基于4個匯編級別的關鍵字來禁止指令重排的,其中volatile的重拍規則如下:

?
  1. 第一個為讀操作時,第二個任何操作不可重排序到第一個前面。
  2. 第二個為寫操作時,第一個任何操作不可重排序到第二個后面。
  3. 第一個為寫操作時,第二個的讀寫操作也不運行重排序。
?


volatile寫底層實現

JMM對volatile的內存屏障插入策略

?

在每個volatile寫操作的前面插入一個StoreStore屏障。在每個volatile寫操作的后面插入一個StoreLoad屏障。

?
在這里插入圖片描述

volatile 讀底層

JMM對volatile的內存屏障插入策略

?

在每個volatile讀操作的后面插入一個LoadLoad屏障。在每個volatile讀操作的后面插入一個LoadStore屏障。

?
在這里插入圖片描述

其中重點說下volatile讀后面為什么跟了個LoadLoad。加入我有如下代碼 AB兩個線程執行,B線程的flag獲取下面的讀被提前了。

volatile的實現原理

有volatile變量修飾的共享變量進行寫操作的時候會使用CPU提供的Lock前綴指令。在CPU級別的功能如下:

?
  1. 將當前處理器緩存行的數據寫回到「系統內存」
  2. 這個寫回內存的操作會告知在其他CPU你們拿到的變量是無效的下一次使用時候要重新共享內存拿。
?

我們可以通過jitwatch對簡單的代碼進行詳細的反匯編看一下。

package com.sowhat.demo;

public class VolaSemanteme {
    int unvloatileVal = 0;
    volatile boolean flag = false;

    public void init() {
        unvloatileVal = 1;
        flag = true// 第九行哦
    }
    public void use() {

        if (flag) {
            int LocalA = unvloatileVal;
            if (LocalA == 0) {
                throw new RuntimeException("error");
            }
        }
    }
    public static void main(String[] args) {
        VolaSemanteme volaSemanteme = new VolaSemanteme();
        volaSemanteme.init();
        volaSemanteme.use();
    }
}

對普通變量的賦值操作:volatile變量的賦值操作。可以對比得出,volatile 修飾的變量確實會多一個 lock addl $0x0,(%rsp) 指令。

0x0000000114ce95cb: lock addl $0x0,(%rsp)  ;*putfield flag
  ; - com.sowhat.demo.VolaSemanteme::init@7 (line 9)

往期推薦


1、深度好文|面試官:進程和線程,我只問這19個問題

2、他來了,他來了,C++17新特性精華都在這了

3、一文讓你搞懂設計模式

4、C++11新特性,所有知識點都在這了!




亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线 亚洲欧美在线综合一区| 欧美日韩日韩| 老司机免费视频一区二区| 国产日韩欧美不卡在线| 欧美有码视频| 国产视频精品va久久久久久| 久久精品盗摄| 亚洲福利精品| 欧美日韩伊人| 欧美在线视频一区| 亚洲国产天堂网精品网站| 欧美日韩网址| 欧美亚洲尤物久久| 亚洲第一福利社区| 国产精品家庭影院| 久久综合狠狠综合久久综合88| 韩日欧美一区二区三区| 欧美精品免费视频| 午夜在线观看免费一区| 亚洲福利视频免费观看| 欧美午夜不卡在线观看免费| 久久精品成人一区二区三区蜜臀| 亚洲国产精品ⅴa在线观看| 欧美调教视频| 卡一卡二国产精品| 亚洲综合国产| 亚洲欧洲三级| 国产亚洲视频在线| 欧美日韩一级黄| 久久综合999| 亚洲欧美激情精品一区二区| 亚洲国产人成综合网站| 国产欧美精品| 欧美日韩综合不卡| 美女脱光内衣内裤视频久久网站| 亚洲亚洲精品三区日韩精品在线视频 | 麻豆精品精华液| 亚洲一区在线免费观看| 亚洲国产精品一区在线观看不卡| 国产精品免费一区二区三区观看| 欧美高清视频一区| 美日韩在线观看| 久久精品国产99精品国产亚洲性色 | 一区二区三区日韩精品| 精品1区2区3区4区| 国产一区二区三区丝袜| 国产精品一区二区你懂的| 欧美精品一区二区在线观看| 久久视频在线看| 久久精品亚洲一区| 久久精品网址| 久久精品国产一区二区三| 午夜精品久久久久影视| 亚洲中字在线| 亚洲一区制服诱惑| 亚洲男女毛片无遮挡| 亚洲少妇最新在线视频| 中文精品99久久国产香蕉| 亚洲免费观看| 夜夜精品视频| 亚洲一品av免费观看| 久久久噜噜噜久噜久久| 香蕉亚洲视频| 欧美专区日韩视频| 久久黄色小说| 久久午夜电影| 欧美成人日本| 欧美日在线观看| 国产精品亚洲一区| 国产私拍一区| 1024精品一区二区三区| 亚洲国产欧美日韩精品| 亚洲区在线播放| 在线视频你懂得一区| 亚洲图片激情小说| 欧美一区二区在线免费播放| 久久国产主播精品| 免费久久精品视频| 欧美日韩一二区| 国产精品香蕉在线观看| 国内精品久久久久影院色| 亚洲福利精品| 亚洲图片在线| 久久久久久久久久久一区| 欧美成年人在线观看| 欧美日韩一区二区欧美激情| 国产精品影院在线观看| 在线观看一区欧美| 亚洲小视频在线| 久久久人成影片一区二区三区观看 | 国产午夜一区二区三区| 伊人夜夜躁av伊人久久| 99xxxx成人网| 久久久久成人精品| 欧美三级在线视频| 国产视频在线观看一区| 亚洲激情在线激情| 午夜日韩福利| 欧美日韩国产大片| 激情五月***国产精品| 亚洲天堂av在线免费| 欧美69视频| 国产一区二区三区在线观看免费视频 | 国产午夜精品视频| 亚洲伦理在线| 久久久青草婷婷精品综合日韩 | 亚洲美女黄色| 欧美在线视频a| 欧美日韩综合在线免费观看| 伊人一区二区三区久久精品| 亚洲综合电影一区二区三区| 亚洲欧美中文另类| 欧美日韩一二区| 欧美国产在线观看| 国产欧美91| 亚洲一区二区在线播放| 欧美mv日韩mv国产网站| 国产一区深夜福利| 亚洲欧美亚洲| 欧美新色视频| 夜夜狂射影院欧美极品| 欧美大色视频| 亚洲国产精品一区二区三区| 久久久久久久一区二区| 在线精品国产成人综合| 欧美一二三视频| 国产精品久久久久一区二区三区| 日韩一二三区视频| 欧美激情视频一区二区三区不卡| 亚洲第一在线| 美日韩精品视频| 亚洲福利在线看| 麻豆成人在线观看| 国内久久婷婷综合| 欧美日韩亚洲激情| 欧美日韩国产色综合一二三四 | 欧美另类极品videosbest最新版本 | 国产在线乱码一区二区三区| 久久久久久久精| 有码中文亚洲精品| 欧美成年人网| 久久久久久久网| 久久久久久黄| 欧美精品在线免费观看| 欧美精品福利| 这里是久久伊人| 国产精品夫妻自拍| 亚洲人成网站在线观看播放| 久久久精品欧美丰满| 日韩亚洲不卡在线| 国内外成人在线视频| 欧美成人一二三| 欧美激情综合五月色丁香小说| 欧美另类极品videosbest最新版本| 欧美日韩国产一中文字不卡 | 久久国产精品久久w女人spa| 亚洲欧美日韩精品在线| 久久av一区二区三区漫画| 国产目拍亚洲精品99久久精品| 黑人巨大精品欧美黑白配亚洲| 亚洲一区观看| 国产精品jvid在线观看蜜臀| 亚洲视频狠狠| 韩国av一区二区三区四区| 老**午夜毛片一区二区三区| 亚洲国产精品久久久久秋霞不卡| 欧美激情一区在线| 亚洲自拍偷拍色片视频| 国产亚洲欧美一区二区三区| 免费欧美在线| 亚洲欧美999| 亚洲第一精品久久忘忧草社区| 欧美精品一区二区视频 | 午夜国产精品影院在线观看| 国产亚洲成av人片在线观看桃| 欧美二区在线| 欧美一区二区三区日韩| 亚洲人成小说网站色在线| 国产欧美一级| 欧美日韩国产首页| 久久免费少妇高潮久久精品99| 一区二区三区四区精品| 在线免费不卡视频| 国产欧美一区二区视频| 欧美日韩亚洲免费| 免费久久久一本精品久久区| 欧美亚洲日本网站| 日韩视频中文字幕| 在线日韩日本国产亚洲| 国产欧美短视频| 欧美视频官网| 欧美国产精品日韩| 久久精品首页| 欧美一区二区三区视频在线 | 亚洲国产日本| 狠狠干成人综合网| 国产欧美精品| 国产精品久久久久久av下载红粉| 欧美精品免费播放| 欧美国产在线视频|