欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

volatile是什么

本篇內(nèi)容主要講解“volatile是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“volatile是什么”吧!

10年積累的成都做網(wǎng)站、網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有新城免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

今天閑來無事跟同事小麥大叔閑聊,

SoWhat:麥?zhǔn)迓犝f你偷偷面阿里啦,面的咋樣?
小麥大叔: 一面挺簡(jiǎn)單的,主要問了一些基本的數(shù)據(jù)結(jié)構(gòu)跟算法,還問了下 HashMap的十大常見基本問題。我都答案上來了,還問了我JDK7環(huán),幸虧你那個(gè)HashMap環(huán)繪制的牛逼,我答的不錯(cuò)就讓我準(zhǔn)備二面了。
SoWhat:二面類?
小麥大叔:二面問了我一些JVM的問題,問我對(duì)于JVM內(nèi)存模型的理解,還有GC的常見理解,最終還問了我下類加載機(jī)制,我看你之前水過這個(gè) JVM系列,就依葫蘆畫瓢答上來了,讓我準(zhǔn)備三面。
SoWhat:麥?zhǔn)暹@波可以啊,三面問的啥啊?
小麥大叔:三面問了我一些CAS、Lock、AQS跟 ConcurrentHashMap 的底層實(shí)現(xiàn)什么的,還問了我下線程池的七大參數(shù)跟四大拒絕策略,以及使用注意事項(xiàng)。我看你水過 并發(fā)編程系列,也就答上來了。
Sowhat:厲害啊這是要過的節(jié)奏阿!
小麥大叔:過個(gè)錘子,三面的這個(gè)總監(jiān)最后竟然問了我下我對(duì)volatile的底層原理。你妹的你么水,我就答了一些基本的可見性跟弱原子性,然后我感覺面試官不太滿意?。?br/>Sowhat:額好吧,那我抓緊再水文寫下個(gè)關(guān)于volatile的使用。

使用

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

  1. 可見性。對(duì)一個(gè)volatile變量的讀,總是能看到(任意線程)對(duì)這個(gè)volatile變量最后的寫入。

  2. 原子性:對(duì)任意單個(gè)volatile變量的讀/寫具有原子性,但類似于volatile++這種復(fù)合操作不具有原子性。

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

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

寫理解

volatile寫的內(nèi)存語義如下:

當(dāng)寫一個(gè)volatile變量時(shí),JMM會(huì)把該線程對(duì)應(yīng)的本地中的共享變量值刷新到主內(nèi)存。

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

線程A調(diào)用init方法,線程B調(diào)用use方法。
volatile是什么

讀理解

volatile讀的內(nèi)存語義如下:

當(dāng)讀一個(gè)volatile變量時(shí),JMM會(huì)把該線程對(duì)應(yīng)的本地內(nèi)存置為無效。線程接下來將從主內(nèi)存中讀取共享變量。

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

流程圖大致是這樣的:
volatile是什么

volatile 指令重排

volatile 變量的內(nèi)存可見性是基于內(nèi)存屏障(Memory Barrier)實(shí)現(xiàn)。關(guān)于內(nèi)存屏障的具體講解以前寫過不再重復(fù),JMM裝逼于無形這里說過??偨Y(jié)來說就是JMM內(nèi)部會(huì)有指令重排,并且會(huì)有af-if-serialhappen-before的理念來保證指令重拍的正確性。內(nèi)存屏障就是基于4個(gè)匯編級(jí)別的關(guān)鍵字來禁止指令重排的,其中volatile的重拍規(guī)則如下:

  1. 第一個(gè)為讀操作時(shí),第二個(gè)任何操作不可重排序到第一個(gè)前面。

  2. 第二個(gè)為寫操作時(shí),第一個(gè)任何操作不可重排序到第二個(gè)后面。

  3. 第一個(gè)為寫操作時(shí),第二個(gè)的讀寫操作也不運(yùn)行重排序。

volatile是什么

volatile寫底層實(shí)現(xiàn)

JMM對(duì)volatile的內(nèi)存屏障插入策略

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

volatile是什么

volatile 讀底層

JMM對(duì)volatile的內(nèi)存屏障插入策略

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

volatile是什么

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

volatile的實(shí)現(xiàn)原理

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

  1. 將當(dāng)前處理器緩存行的數(shù)據(jù)寫回到系統(tǒng)內(nèi)存

  2. 這個(gè)寫回內(nèi)存的操作會(huì)告知在其他CPU你們拿到的變量是無效的下一次使用時(shí)候要重新共享內(nèi)存拿。

我們可以通過jitwatch對(duì)簡(jiǎn)單的代碼進(jìn)行詳細(xì)的反匯編看一下。

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();}}

對(duì)普通變量的賦值操作:
volatile是什么
對(duì)volatile變量的賦值操作。
volatile是什么
可以對(duì)比得出,volatile 修飾的變量確實(shí)會(huì)多一個(gè) lock addl $0x0,(%rsp) 指令。

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

到此,相信大家對(duì)“volatile是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)站題目:volatile是什么
轉(zhuǎn)載源于:http://chinadenli.net/article14/jeijge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、營(yíng)銷型網(wǎng)站建設(shè)用戶體驗(yàn)、網(wǎng)站營(yíng)銷自適應(yīng)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
亚洲五月婷婷中文字幕| 91在线国内在线中文字幕| 日韩精品中文字幕在线视频| 国产福利一区二区三区四区| 国产亚洲精品香蕉视频播放| 狠狠亚洲丁香综合久久| 91偷拍与自偷拍精品| 久久精品中文扫妇内射| 好骚国产99在线中文| 午夜小视频成人免费看| 久草视频在线视频在线观看| 成人日韩在线播放视频| 美女被后入福利在线观看| 成人国产一区二区三区精品麻豆| 国产av一区二区三区四区五区| 亚洲天堂精品在线视频| av免费视屏在线观看| 亚洲内射人妻一区二区| 国产成人精品在线一区二区三区| 五月天综合网五月天综合网| 天堂网中文字幕在线观看| 久久三级国外久久久三级| 亚洲高清一区二区高清| 在线中文字幕亚洲欧美一区| 91国内视频一区二区三区| 九九九热视频免费观看| 少妇成人精品一区二区| 欧美成人精品一区二区久久| 欧美黑人暴力猛交精品| 欧美av人人妻av人人爽蜜桃| 国产午夜福利一区二区| 欧美精品一区久久精品| 欧美三级不卡在线观线看| 人妻乱近亲奸中文字幕| 熟女乱一区二区三区四区| 国产精品白丝一区二区| 91插插插外国一区二区| 国产欧美一区二区久久| 人人妻在人人看人人澡| 国产成人精品视频一区二区三区 | 国产高清一区二区白浆|