簡單了解java volatile
內(nèi)存模型基本概念
計算機在執(zhí)行程序時,每條指令都是在CPU中執(zhí)行的,而執(zhí)行指令過程中,勢必涉及到數(shù)據(jù)的讀取和寫入。由于程序運行過程中的臨時數(shù)據(jù)是存放在主存(物理內(nèi)存)當中的,這時就存在一個問題,由于CPU執(zhí)行速度很快,而從內(nèi)存讀取數(shù)據(jù)和向內(nèi)存寫入數(shù)據(jù)的過程跟CPU執(zhí)行指令的速度比起來要慢的多,因此如果任何時候?qū)?shù)據(jù)的操作都要通過和內(nèi)存的交互來進行,會大大降低指令執(zhí)行的速度。因此在CPU里面就有了高速緩存。
并發(fā)編程中的三個概念
1、原子性
即一個操作或者多個操作,要么全部執(zhí)行并且執(zhí)行的過程不會被任何因素打斷,要么就都不執(zhí)行。
2、可見性
指當多個線程訪問同一個變量時,一個線程修改了這個變量的值,其他線程能夠立即看得到修改的值。
3、有序性
即程序執(zhí)行的順序按照代碼的先后順序執(zhí)行。一般來說,處理器為了提高程序運行效率,可能會對輸入代碼進行優(yōu)化,它不保證程序中各個語句的執(zhí)行先后順序同代碼中的順序一致,但是它會保證程序最終執(zhí)行結(jié)果和代碼順序執(zhí)行的結(jié)果是一致的。
Java內(nèi)存模型
在Java虛擬機規(guī)范中試圖定義一種Java內(nèi)存模型(Java Memory Model,JMM)來屏蔽各個硬件平臺和操作系統(tǒng)的內(nèi)存訪問差異,以實現(xiàn)讓Java程序在各種平臺下都能達到一致的內(nèi)存訪問效果。那么Java內(nèi)存模型規(guī)定了哪些東西呢,它定義了程序中變量的訪問規(guī)則,往大一點說是定義了程序執(zhí)行的次序。注意,為了獲得較好的執(zhí)行性能,Java內(nèi)存模型并沒有限制執(zhí)行引擎使用處理器的寄存器或者高速緩存來提升指令執(zhí)行速度,也沒有限制編譯器對指令進行重排序。也就是說,在java內(nèi)存模型中,也會存在緩存一致性問題和指令重排序的問題。
注意,圖中的工作內(nèi)存實際上就對應于硬件層面上的cpu cache。
volatile關鍵字
它保證了可見性和有序性,但是它不保證原子性。
下面這段話摘自《深入理解Java虛擬機》:
“觀察加入volatile關鍵字和沒有加入volatile關鍵字時所生成的匯編代碼發(fā)現(xiàn),加入volatile關鍵字時,會多出一個lock前綴指令”
lock前綴指令實際上相當于一個內(nèi)存屏障(也成內(nèi)存柵欄),內(nèi)存屏障會提供3個功能:
1.它確保指令重排序時不會把其后面的指令排到內(nèi)存屏障之前的位置,也不會把前面的指令排到內(nèi)存屏障的后面;即在執(zhí)行到內(nèi)存屏障這句指令時,在它前面的操作已經(jīng)全部完成;
2.它會強制將對緩存的修改操作立即寫入主存;
3.如果是寫操作,它會導致其他CPU中對應的緩存行無效。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot同一接口多個實現(xiàn)類配置的實例詳解
這篇文章主要介紹了SpringBoot同一接口多個實現(xiàn)類配置的實例詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11Java實現(xiàn)byte[]轉(zhuǎn)List的示例代碼
byte,即字節(jié),由8位的二進制組成。在Java中,byte類型的數(shù)據(jù)是8位帶符號的二進制數(shù)。List?是一個接口,它繼承于Collection的接口。它代表著有序的隊列。本文將介紹如何通過java實現(xiàn)byte[]轉(zhuǎn)List,需要的可以參考一下2022-01-01Springboot整合SpringSecurity實現(xiàn)登錄認證和鑒權(quán)全過程
這篇文章主要介紹了Springboot整合SpringSecurity實現(xiàn)登錄認證和鑒權(quán)全過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12spring?@Transactional注解中常用參數(shù)詳解
這篇文章主要介紹了spring?@Transactional注解中常用參數(shù)詳解,事物注解方式:?@Transactional,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2024-02-02