国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

volatile詳解

aikin / 3285人閱讀

摘要:內(nèi)存模型基本概念計(jì)算機(jī)在執(zhí)行程序時(shí),每條指令都是在中執(zhí)行的,而執(zhí)行指令過(guò)程中,勢(shì)必涉及到數(shù)據(jù)的讀取和寫入。有序性即程序執(zhí)行的順序按照代碼的先后順序執(zhí)行。

內(nèi)存模型基本概念

計(jì)算機(jī)在執(zhí)行程序時(shí),每條指令都是在CPU中執(zhí)行的,而執(zhí)行指令過(guò)程中,勢(shì)必涉及到數(shù)據(jù)的讀取和寫入。由于程序運(yùn)行過(guò)程中的臨時(shí)數(shù)據(jù)是存放在主存(物理內(nèi)存)當(dāng)中的,這時(shí)就存在一個(gè)問(wèn)題,由于CPU執(zhí)行速度很快,而從內(nèi)存讀取數(shù)據(jù)和向內(nèi)存寫入數(shù)據(jù)的過(guò)程跟CPU執(zhí)行指令的速度比起來(lái)要慢的多,因此如果任何時(shí)候?qū)?shù)據(jù)的操作都要通過(guò)和內(nèi)存的交互來(lái)進(jìn)行,會(huì)大大降低指令執(zhí)行的速度。因此在CPU里面就有了高速緩存。

并發(fā)編程中的三個(gè)概念

1?原子性
即一個(gè)操作或者多個(gè)操作,要么全部執(zhí)行并且執(zhí)行的過(guò)程不會(huì)被任何因素打斷,要么就都不執(zhí)行。
2?可見性
指當(dāng)多個(gè)線程訪問(wèn)同一個(gè)變量時(shí),一個(gè)線程修改了這個(gè)變量的值,其他線程能夠立即看得到修改的值。
3?有序性
即程序執(zhí)行的順序按照代碼的先后順序執(zhí)行。一般來(lái)說(shuō),處理器為了提高程序運(yùn)行效率,可能會(huì)對(duì)輸入代碼進(jìn)行優(yōu)化,它不保證程序中各個(gè)語(yǔ)句的執(zhí)行先后順序同代碼中的順序一致,但是它會(huì)保證程序最終執(zhí)行結(jié)果和代碼順序執(zhí)行的結(jié)果是一致的。

Java內(nèi)存模型

在Java虛擬機(jī)規(guī)范中試圖定義一種Java內(nèi)存模型(Java Memory Model,JMM)來(lái)屏蔽各個(gè)硬件平臺(tái)和操作系統(tǒng)的內(nèi)存訪問(wèn)差異,以實(shí)現(xiàn)讓Java程序在各種平臺(tái)下都能達(dá)到一致的內(nèi)存訪問(wèn)效果。那么Java內(nèi)存模型規(guī)定了哪些東西呢,它定義了程序中變量的訪問(wèn)規(guī)則,往大一點(diǎn)說(shuō)是定義了程序執(zhí)行的次序。注意,為了獲得較好的執(zhí)行性能,Java內(nèi)存模型并沒有限制執(zhí)行引擎使用處理器的寄存器或者高速緩存來(lái)提升指令執(zhí)行速度,也沒有限制編譯器對(duì)指令進(jìn)行重排序。也就是說(shuō),在java內(nèi)存模型中,也會(huì)存在緩存一致性問(wèn)題和指令重排序的問(wèn)題。

注意,圖中的工作內(nèi)存實(shí)際上就對(duì)應(yīng)于硬件層面上的cpu cache。

volatile關(guān)鍵字

它保證了可見性和有序性,但是它不保證原子性。
下面這段話摘自《深入理解Java虛擬機(jī)》:

“觀察加入volatile關(guān)鍵字和沒有加入volatile關(guān)鍵字時(shí)所生成的匯編代碼發(fā)現(xiàn),加入volatile關(guān)鍵字時(shí),會(huì)多出一個(gè)lock前綴指令”

lock前綴指令實(shí)際上相當(dāng)于一個(gè)內(nèi)存屏障(也成內(nèi)存柵欄),內(nèi)存屏障會(huì)提供3個(gè)功能:

它確保指令重排序時(shí)不會(huì)把其后面的指令排到內(nèi)存屏障之前的位置,也不會(huì)把前面的指令排到內(nèi)存屏障的后面;即在執(zhí)行到內(nèi)存屏障這句指令時(shí),在它前面的操作已經(jīng)全部完成;

它會(huì)強(qiáng)制將對(duì)緩存的修改操作立即寫入主存;

如果是寫操作,它會(huì)導(dǎo)致其他CPU中對(duì)應(yīng)的緩存行無(wú)效。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/67011.html

相關(guān)文章

  • 一起學(xué)并發(fā)編程 - Volatile關(guān)鍵字詳解

    摘要:比如用修飾的變量,就會(huì)確保變量在修改時(shí),其它線程是可見的。。多核環(huán)境中,多個(gè)線程分別在不同的中運(yùn)行,就意味著,多個(gè)線程都有可能將變量拷貝到當(dāng)前運(yùn)行的里。當(dāng)線程讀取變量時(shí),它將能看見被線程寫入的東西。 volatile是用來(lái)標(biāo)記一個(gè)JAVA變量存儲(chǔ)在主內(nèi)存(main memory)中,多線程讀寫volatile變量會(huì)先從高速緩存中讀取,但是寫入的時(shí)候會(huì)立即通過(guò)內(nèi)存總線刷到主存,同時(shí)內(nèi)存總...

    vpants 評(píng)論0 收藏0
  • SynchronousQueue原理詳解-非公平模式

    摘要:開篇說(shuō)明本文分析采用的是約定下面內(nèi)容中代表的是引用地址,引用對(duì)應(yīng)的節(jié)點(diǎn)前面已經(jīng)講解了公平模式的內(nèi)容,今天來(lái)講解下關(guān)于非公平模式下的是如何進(jìn)行工作的,在源碼分析的時(shí)候,先來(lái)簡(jiǎn)單看一下非公平模式的簡(jiǎn)單原理,它采用的棧這種先進(jìn)后出的方式進(jìn)行非公 開篇 說(shuō)明:本文分析采用的是jdk1.8約定:下面內(nèi)容中Ref-xxx代表的是引用地址,引用對(duì)應(yīng)的節(jié)點(diǎn) 前面已經(jīng)講解了公平模式的內(nèi)容,今天來(lái)講解下...

    cloud 評(píng)論0 收藏0
  • Java 中的偽共享詳解及解決方案

    摘要:對(duì)于偽共享的傳統(tǒng)解決方案微信公眾號(hào)技術(shù)棧以上使用此方法的某個(gè)版本對(duì)偽共享做了優(yōu)化以下使用此方法中的解決方案中已經(jīng)提供了官方的解決方案,中新增了一個(gè)注解。 1. 什么是偽共享 CPU 緩存系統(tǒng)中是以緩存行(cache line)為單位存儲(chǔ)的。目前主流的 CPU Cache 的 Cache Line 大小都是 64 Bytes。在多線程情況下,如果需要修改共享同一個(gè)緩存行的變量,就會(huì)無(wú)意中...

    BenCHou 評(píng)論0 收藏0
  • 40道阿里巴巴JAVA研發(fā)崗多線程面試題詳解,你能答出多少

    摘要:但是單核我們還是要應(yīng)用多線程,就是為了防止阻塞。多線程可以防止這個(gè)問(wèn)題,多條線程同時(shí)運(yùn)行,哪怕一條線程的代碼執(zhí)行讀取數(shù)據(jù)阻塞,也不會(huì)影響其它任務(wù)的執(zhí)行。 1、多線程有什么用?一個(gè)可能在很多人看來(lái)很扯淡的一個(gè)問(wèn)題:我會(huì)用多線程就好了,還管它有什么用?在我看來(lái),這個(gè)回答更扯淡。所謂知其然知其所以然,會(huì)用只是知其然,為什么用才是知其所以然,只有達(dá)到知其然知其所以然的程度才可以說(shuō)是把一個(gè)知識(shí)點(diǎn)...

    lpjustdoit 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

aikin

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<