大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

Java面向對象
Java異常
Java數組
Java常用類
Java集合
Java IO流
Java線程
Java反射
Socket編程
Java注解開發
Java GoF設計模式
HashMap
Java內存模型
Java線性表

Java內存模型的概念

volatile這個關鍵字可能很多朋友都聽說過,或許也都用過。在Java 5之前,它是一個備受爭議的關鍵字,因為在程序中使用它往往會導致出人意料的結果。在Java 5之后,volatile關鍵字才得以重獲生機。

volatile關鍵字雖然從字面上理解起來比較簡單,但是要用好不是一件容易的事情。由于volatile關鍵字是與Java的內存模型有關的,因此在講述volatile關鍵之前,我們先來了解一下與內存模型相關的概念和知識,然后分析了volatile關鍵字的實現原理,最后給出了幾個使用volatile關鍵字的場景。

以下是本文的目錄大綱:

一、Java內存模型的概念

二、Java并發編程中的三個概念

三、Java內存模型

四、深入剖析volatile關鍵字

五、使用volatile關鍵字的場景

Java內存模型的概念

大家都知道,計算機在執行程序時,每條指令都是在CPU中執行的,而執行指令過程中,勢必涉及到數據的讀取和寫入。由于程序運行過程中的臨時數據是存放在主存(物理內存)當中的,這時就存在一個問題,由于CPU執行速度很快,而從內存讀取數據和向內存寫入數據的過程跟CPU執行指令的速度比起來要慢的多,因此如果任何時候對數據的操作都要通過和內存的交互來進行,會大大降低指令執行的速度。因此在CPU里面就有了高速緩存。

也就是,當程序在運行過程中,會將運算需要的數據從主存復制一份到CPU的高速緩存當中,那么CPU進行計算時就可以直接從它的高速緩存讀取數據和向其中寫入數據,當運算結束之后,再將高速緩存中的數據刷新到主存當中。舉個簡單的例子,比如下面的這段代碼:

i = i + 1;

當線程執行這個語句時,會先從主存當中讀取i的值,然后復制一份到高速緩存當中,然后CPU執行指令對i進行加1操作,然后將數據寫入高速緩存,最后將高速緩存中i最新的值刷新到主存當中。

這個代碼在單線程中運行是沒有任何問題的,但是在多線程中運行就會有問題了。在多核CPU中,每條線程可能運行于不同的CPU中,因此每個線程運行時有自己的高速緩存(對單核CPU來說,其實也會出現這種問題,只不過是以線程調度的形式來分別執行的)。本文我們以多核CPU為例。

比如同時有2個線程執行這段代碼,假如初始時i的值為0,那么我們希望兩個線程執行完之后i的值變為2。但是事實會是這樣嗎?

可能存在下面一種情況:初始時,兩個線程分別讀取i的值存入各自所在的CPU的高速緩存當中,然后線程1進行加1操作,然后把i的最新值1寫入到內存。此時線程2的高速緩存當中i的值還是0,進行加1操作之后,i的值為1,然后線程2把i的值寫入內存。

最終結果i的值是1,而不是2。這就是著名的緩存一致性問題。通常稱這種被多個線程訪問的變量為共享變量。

也就是說,如果一個變量在多個CPU中都存在緩存(一般在多線程編程時才會出現),那么就可能存在緩存不一致的問題。

為了解決緩存不一致性問題,通常來說有以下2種解決方法:

1、通過在總線加LOCK#鎖的方式

2、通過緩存一致性協議

這2種方式都是硬件層面上提供的方式。

在早期的CPU當中,是通過在總線上加LOCK#鎖的形式來解決緩存不一致的問題。因為CPU和其他部件進行通信都是通過總線來進行的,如果對總線加LOCK#鎖的話,也就是說阻塞了其他CPU對其他部件訪問(如內存),從而使得只能有一個CPU能使用這個變量的內存。比如上面例子中 如果一個線程在執行 i = i +1,如果在執行這段代碼的過程中,在總線上發出了LCOK#鎖的信號,那么只有等待這段代碼完全執行完畢之后,其他CPU才能從變量i所在的內存讀取變量,然后進行相應的操作。這樣就解決了緩存不一致的問題。

但是上面的方式會有一個問題,由于在鎖住總線期間,其他CPU無法訪問內存,導致效率低下。所以就出現了緩存一致性協議。最出名的就是Intel 的MESI協議,MESI協議保證了每個緩存中使用的共享變量的副本是一致的。它核心的思想是:當CPU寫數據時,如果發現操作的變量是共享變量,即在其他CPU中也存在該變量的副本,會發出信號通知其他CPU將該變量的緩存行置為無效狀態,因此當其他CPU需要讀取這個變量時,發現自己緩存中緩存該變量的緩存行是無效的,那么它就會從內存重新讀取。

全部教程
主站蜘蛛池模板: 色综合社区 | 一二三四社区在线播放 | 久久国产欧美另类久久久 | 狠狠色伊人亚洲综合成人 | 在线免费观看视频a | 4hu影院最新地址www | 一级a爱片久久毛片 | 2021中文字幕亚洲精品 | 久久久久久久综合日本亚洲 | 久久国产免费观看精品 | 四虎成人欧美精品在永久在线 | 亚洲国产精品线播放 | 国产欧美一区二区精品性色 | 日韩欧美中文字幕出 | 国内精品久久久久影院老司 | 大陆60老妇xxxxhd | 欧美综合亚洲图片综合区 | 日韩国产欧美一区二区三区在线 | 高清欧美一级在线观看 | 大学生一一级毛片在线播放 | 色88888久久久久久影院 | 免费福利在线视频 | 成人免费一级毛片在线播放视频 | 国产成人免费视频精品一区二区 | 亚洲欧洲日韩国产一区二区三区 | 米奇精品一区二区三区 | 天天拍天天干 | 天天综合亚洲国产色 | 精品国产欧美一区二区最新 | 亚洲成人视屏 | 国产乱码亚洲精品一区二区 | 色玖玖| 国产成人啪午夜精品网站男同 | 日韩欧美一区二区在线观看 | 夜夜精品视频一区二区 | 国产亚洲精品久久麻豆 | 2021国产精品自产拍在线观看 | 91精品国产综合久久久久久 | 日本不卡免免费观看 | 免费观看国产网址你懂的 | 思99re久久这里只有精品首页 |