成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

求你了,再問(wèn)你Java內(nèi)存模型的時(shí)候別再給我講堆棧方法區(qū)了…

開(kāi)發(fā) 后端
有的時(shí)候,我會(huì)進(jìn)一步提醒一句:是和并發(fā)編程有關(guān)的,是和主內(nèi)存以及線程工作內(nèi)存有關(guān)的,那么,本文就來(lái)簡(jiǎn)單說(shuō)一說(shuō),關(guān)于Java內(nèi)存模型,到底應(yīng)該如何回答這個(gè)面試題。

 [[269811]]

最近,面試過(guò)很多Java中高級(jí)開(kāi)發(fā),問(wèn)過(guò)很多次關(guān)于Java內(nèi)存模型的知識(shí),問(wèn)完之后,很多人上來(lái)就開(kāi)始回答:

Java內(nèi)存模型由幾部分組成,堆、本地方法棧、虛擬機(jī)棧、方法區(qū)…

每一次我不想打斷他們的話,雖然我知道這又是一個(gè)誤會(huì)了我的問(wèn)題的朋友。

其實(shí),我想問(wèn)的Java內(nèi)存模型,是和并發(fā)編程有關(guān)的。而候選人給我回答的那叫JVM內(nèi)存結(jié)構(gòu),完全是兩回事。

很多時(shí)候,在我沒(méi)有打斷他們的情況下,一部分人慢慢的講到了GC相關(guān)的知識(shí)。這種情況下,我只能硬著頭皮繼續(xù)問(wèn)一些和JVM有關(guān)的知識(shí)。

但是,我的本意其實(shí)是想看一下他對(duì)Java并發(fā)有多少了解啊。

經(jīng)常,我都在繼續(xù)追問(wèn)了一些他們回答的"Java內(nèi)存模型"相關(guān)的知識(shí)后,友善的提醒一句,其實(shí)我想問(wèn)的Java內(nèi)存模型并不是他回答的這個(gè)…

有的時(shí)候,我會(huì)進(jìn)一步提醒一句:是和并發(fā)編程有關(guān)的,是和主內(nèi)存以及線程工作內(nèi)存有關(guān)的。。。

那么,本文就來(lái)簡(jiǎn)單說(shuō)一說(shuō),關(guān)于Java內(nèi)存模型,到底應(yīng)該如何回答這個(gè)面試題。

PS:這篇文章并不是咬文嚼字,也不是故意的"為賦新詞強(qiáng)說(shuō)愁"。只是覺(jué)得JMM是Java語(yǔ)言規(guī)范中有明確定義的,不信你找?guī)妆颈容^經(jīng)典的介紹JVM和并發(fā)編程的書(shū)看看,都是無(wú)任何歧義的。作者堅(jiān)持以為:不能因?yàn)閯e人真不懂,我就跟著裝傻!

1.為什么會(huì)誤解

首先,我們先來(lái)分析一下問(wèn)什么很多人,甚至是大多數(shù)人會(huì)答非所問(wèn)呢?

我覺(jué)得主要有幾個(gè)原因:

1、Java內(nèi)存模型,這個(gè)詞聽(tīng)著太像是關(guān)于內(nèi)存分布的知識(shí)了。聽(tīng)上去和并發(fā)編程沒(méi)有半毛錢關(guān)系。

2、網(wǎng)上很多資料都是錯(cuò)的。不信你去網(wǎng)上搜索一下"Java內(nèi)存模型",你會(huì)發(fā)現(xiàn),很多人打著內(nèi)存模型的標(biāo)題,介紹了JVM內(nèi)存結(jié)構(gòu)的知識(shí)。

這里提一句,我嘗試著Google搜索了一下搜索"Java內(nèi)存模型",首頁(yè)展示結(jié)果如下:

首頁(yè)排名靠前的5篇文章中,有1篇是錯(cuò)的,介紹了JVM內(nèi)存結(jié)構(gòu)。

值得慶幸的的是,首頁(yè)前5篇文章中,有兩篇是我寫的,至少我的這兩篇我敢確定是不具備任何誤導(dǎo)性的!!

3、還存在一種情況,雖然不多見(jiàn),但是也有。那就是很多面試官自己也以為內(nèi)存模型就是要介紹堆、棧、方法區(qū)這些知識(shí)。就導(dǎo)致有時(shí)候面試者不知道自己到底應(yīng)該如何回答。

那么,到底什么是Java內(nèi)存模型?關(guān)于這道面試題應(yīng)該如何回答呢?

2.什么是內(nèi)存模型

我曾經(jīng)在《再有人問(wèn)你Java內(nèi)存模型是什么,就把這篇文章發(fā)給他》中詳細(xì)的介紹過(guò)Java內(nèi)存模型的來(lái)龍去脈,這里再重新回顧一下。

Java內(nèi)存模型是根據(jù)英文Java Memory Model(JMM)翻譯過(guò)來(lái)的。其實(shí)JMM并不像JVM內(nèi)存結(jié)構(gòu)一樣是真實(shí)存在的。他只是一個(gè)抽象的概念。

Java內(nèi)存模型的相關(guān)知識(shí)在 JSR-133: Java Memory Model and Thread Specification 中描述的。JMM是和多線程相關(guān)的,他描述了一組規(guī)則或規(guī)范,這個(gè)規(guī)范定義了一個(gè)線程對(duì)共享變量的寫入時(shí)對(duì)另一個(gè)線程是可見(jiàn)的。

Java內(nèi)存模型(Java Memory Model ,JMM)就是一種符合內(nèi)存模型規(guī)范的,屏蔽了各種硬件和操作系統(tǒng)的訪問(wèn)差異的,保證了Java程序在各種平臺(tái)下對(duì)內(nèi)存的訪問(wèn)都能得到一致效果的機(jī)制及規(guī)范。目的是解決由于多線程通過(guò)共享內(nèi)存進(jìn)行通信時(shí),存在的原子性、可見(jiàn)性(緩存一致性)以及有序性問(wèn)題。

那么,我們這里就先來(lái)說(shuō)說(shuō)什么是所謂的內(nèi)存模型規(guī)范、這里提到的原子性、可見(jiàn)性以及有序性又是什么東西?

原子性

線程是CPU調(diào)度的基本單位。CPU有時(shí)間片的概念,會(huì)根據(jù)不同的調(diào)度算法進(jìn)行線程調(diào)度。所以在多線程場(chǎng)景下,就會(huì)發(fā)生原子性問(wèn)題。因?yàn)榫€程在執(zhí)行一個(gè)讀改寫操作時(shí),在執(zhí)行完讀改之后,時(shí)間片耗完,就會(huì)被要求放棄CPU,并等待重新調(diào)度。這種情況下,讀改寫就不是一個(gè)原子操作。即存在原子性問(wèn)題。

緩存一致性

在多核CPU,多線程的場(chǎng)景中,每個(gè)核都至少有一個(gè)L1 緩存。多個(gè)線程訪問(wèn)進(jìn)程中的某個(gè)共享內(nèi)存,且這多個(gè)線程分別在不同的核心上執(zhí)行,則每個(gè)核心都會(huì)在各自的caehe中保留一份共享內(nèi)存的緩沖。由于多核是可以并行的,可能會(huì)出現(xiàn)多個(gè)線程同時(shí)寫各自的緩存的情況,而各自的cache之間的數(shù)據(jù)就有可能不同。

在CPU和主存之間增加緩存,在多線程場(chǎng)景下就可能存在緩存一致性問(wèn)題,也就是說(shuō),在多核CPU中,每個(gè)核的自己的緩存中,關(guān)于同一個(gè)數(shù)據(jù)的緩存內(nèi)容可能不一致。

有序性

除了引入了時(shí)間片以外,由于處理器優(yōu)化和指令重排等,CPU還可能對(duì)輸入代碼進(jìn)行亂序執(zhí)行,比如load->add->save 有可能被優(yōu)化成load->save->add 。這就是有序性問(wèn)題。

多CPU多級(jí)緩存導(dǎo)致的一致性問(wèn)題、CPU時(shí)間片機(jī)制導(dǎo)致的原子性問(wèn)題、以及處理器優(yōu)化和指令重排導(dǎo)致的有序性問(wèn)題等,都硬件的不斷升級(jí)導(dǎo)致的。那么,有沒(méi)有什么機(jī)制可以很好的解決上面的這些問(wèn)題呢?

最簡(jiǎn)單直接的做法就是廢除處理器和處理器的優(yōu)化技術(shù)、廢除CPU緩存,讓CPU直接和主存交互。但是,這么做雖然可以保證多線程下的并發(fā)問(wèn)題。但是,這就有點(diǎn)因噎廢食了。

所以,為了保證并發(fā)編程中可以滿足原子性、可見(jiàn)性及有序性。有一個(gè)重要的概念,那就是——內(nèi)存模型。

為了保證共享內(nèi)存的正確性(可見(jiàn)性、有序性、原子性),內(nèi)存模型定義了共享內(nèi)存系統(tǒng)中多線程程序讀寫操作行為的規(guī)范。通過(guò)這些規(guī)則來(lái)規(guī)范對(duì)內(nèi)存的讀寫操作,從而保證指令執(zhí)行的正確性。它與處理器有關(guān)、與緩存有關(guān)、與并發(fā)有關(guān)、與編譯器也有關(guān)。他解決了CPU多級(jí)緩存、處理器優(yōu)化、指令重排等導(dǎo)致的內(nèi)存訪問(wèn)問(wèn)題,保證了并發(fā)場(chǎng)景下的一致性、原子性和有序性。

針對(duì)上面的這些問(wèn)題,不同的操作系統(tǒng)都有不同的解決方案,而Java語(yǔ)言為了屏蔽掉底層的差異,定義了一套屬于Java語(yǔ)言的內(nèi)存模型規(guī)范,即Java內(nèi)存模型。

Java內(nèi)存模型規(guī)定了所有的變量都存儲(chǔ)在主內(nèi)存中,每條線程還有自己的工作內(nèi)存,線程的工作內(nèi)存中保存了該線程中是用到的變量的主內(nèi)存副本拷貝,線程對(duì)變量的所有操作都必須在工作內(nèi)存中進(jìn)行,而不能直接讀寫主內(nèi)存。不同的線程之間也無(wú)法直接訪問(wèn)對(duì)方工作內(nèi)存中的變量,線程間變量的傳遞均需要自己的工作內(nèi)存和主存之間進(jìn)行數(shù)據(jù)同步進(jìn)行。

而JMM就作用于工作內(nèi)存和主存之間數(shù)據(jù)同步過(guò)程。他規(guī)定了如何做數(shù)據(jù)同步以及什么時(shí)候做數(shù)據(jù)同步。

3.Java內(nèi)存模型的實(shí)現(xiàn)

了解Java多線程的朋友都知道,在Java中提供了一系列和并發(fā)處理相關(guān)的關(guān)鍵字,比如volatile、synchronized、final、concurren包等。其實(shí)這些就是Java內(nèi)存模型封裝了底層的實(shí)現(xiàn)后提供給程序員使用的一些關(guān)鍵字。

在開(kāi)發(fā)多線程的代碼的時(shí)候,我們可以直接使用synchronized等關(guān)鍵字來(lái)控制并發(fā),從來(lái)就不需要關(guān)心底層的編譯器優(yōu)化、緩存一致性等問(wèn)題。所以,Java內(nèi)存模型,除了定義了一套規(guī)范,還提供了一系列原語(yǔ),封裝了底層實(shí)現(xiàn)后,供開(kāi)發(fā)者直接使用。

本文并不準(zhǔn)備把所有的關(guān)鍵字逐一介紹其用法,因?yàn)殛P(guān)于各個(gè)關(guān)鍵字的用法,網(wǎng)上有很多資料。讀者可以自行學(xué)習(xí)。本文還有一個(gè)重點(diǎn)要介紹的就是,我們前面提到,并發(fā)編程要解決原子性、有序性和一致性的問(wèn)題,我們就再來(lái)看下,在Java中,分別使用什么方式來(lái)保證。

原子性

在Java中,為了保證原子性,提供了兩個(gè)高級(jí)的字節(jié)碼指令monitorenter和monitorexit。在synchronized的實(shí)現(xiàn)原理文章中,介紹過(guò),這兩個(gè)字節(jié)碼,在Java中對(duì)應(yīng)的關(guān)鍵字就是synchronized。

因此,在Java中可以使用synchronized來(lái)保證方法和代碼塊內(nèi)的操作是原子性的。

可見(jiàn)性

Java內(nèi)存模型是通過(guò)在變量修改后將新值同步回主內(nèi)存,在變量讀取前從主內(nèi)存刷新變量值的這種依賴主內(nèi)存作為傳遞媒介的方式來(lái)實(shí)現(xiàn)的。

Java中的volatile關(guān)鍵字提供了一個(gè)功能,那就是被其修飾的變量在被修改后可以立即同步到主內(nèi)存,被其修飾的變量在每次是用之前都從主內(nèi)存刷新。因此,可以使用volatile來(lái)保證多線程操作時(shí)變量的可見(jiàn)性。

除了volatile,Java中的synchronized和final兩個(gè)關(guān)鍵字也可以實(shí)現(xiàn)可見(jiàn)性。只不過(guò)實(shí)現(xiàn)方式不同,這里不再展開(kāi)了。

有序性

在Java中,可以使用synchronized和volatile來(lái)保證多線程之間操作的有序性。實(shí)現(xiàn)方式有所區(qū)別:

volatile關(guān)鍵字會(huì)禁止指令重排。synchronized關(guān)鍵字保證同一時(shí)刻只允許一條線程操作。

好了,這里簡(jiǎn)單的介紹完了Java并發(fā)編程中解決原子性、可見(jiàn)性以及有序性可以使用的關(guān)鍵字。讀者可能發(fā)現(xiàn)了,好像synchronized關(guān)鍵字是***的,他可以同時(shí)滿足以上三種特性,這其實(shí)也是很多人濫用synchronized的原因。

但是synchronized是比較影響性能的,雖然編譯器提供了很多鎖優(yōu)化技術(shù),但是也不建議過(guò)度使用。

4.面試如何回答

前面我介紹完了一些和Java內(nèi)存模型有關(guān)的基礎(chǔ)知識(shí),只是基礎(chǔ),并不是全部,因?yàn)殡S便一個(gè)知識(shí)點(diǎn)還是都可以展開(kāi)的,如volatile是如何實(shí)現(xiàn)可見(jiàn)性的?synchronized是如何實(shí)現(xiàn)有序性的?

但是,當(dāng)面試官問(wèn)你:能簡(jiǎn)單介紹下你理解的內(nèi)存模型嗎?

首先,先和面試官確認(rèn)一下:您說(shuō)的內(nèi)存模型指的是JMM,也就是和并發(fā)編程有關(guān)的那一個(gè)吧?

在得到肯定答復(fù)后,再開(kāi)始介紹(如果不是,那可能就要回答堆、棧、方法區(qū)哪些了….囧… 這里也可以根據(jù)上下文自行理解面試官想要問(wèn)的問(wèn)題具體是什么):

Java內(nèi)存模型,其實(shí)是保證了Java程序在各種平臺(tái)下對(duì)內(nèi)存的訪問(wèn)都能夠得到一致效果的機(jī)制及規(guī)范。目的是解決由于多線程通過(guò)共享內(nèi)存進(jìn)行通信時(shí),存在的原子性、可見(jiàn)性(緩存一致性)以及有序性問(wèn)題。

除此之外,Java內(nèi)存模型還提供了一系列原語(yǔ),封裝了底層實(shí)現(xiàn)后,供開(kāi)發(fā)者直接使用。如我們常用的一些關(guān)鍵字:synchronized、volatile以及并發(fā)包等。

回答到這里就可以了,然后面試官可能會(huì)繼續(xù)追問(wèn),然后根據(jù)他的追問(wèn)再繼續(xù)往下回答即可。

所以,當(dāng)有人再問(wèn)你Java內(nèi)存模型的時(shí)候,不要一張嘴就直接回答堆棧、方法區(qū)甚至GC了,先思考下面試官的問(wèn)題。

責(zé)任編輯:龐桂玉 來(lái)源: Hollis
相關(guān)推薦

2020-12-11 09:24:19

Elasticsear存儲(chǔ)數(shù)據(jù)

2020-04-16 08:22:11

HTTPS加解密協(xié)議

2019-12-17 09:29:02

數(shù)據(jù)庫(kù)架構(gòu)分庫(kù)分表

2020-12-02 11:18:50

print調(diào)試代碼Python

2020-12-04 10:05:00

Pythonprint代碼

2018-09-28 05:25:53

TopK算法代碼

2020-06-15 08:12:51

try catch代碼處理器

2020-09-24 14:40:55

Python 開(kāi)發(fā)編程語(yǔ)言

2020-12-15 08:06:45

waitnotifyCondition

2020-04-22 11:19:07

貪心算法動(dòng)態(tài)規(guī)劃

2018-11-01 13:49:23

桶排序排序面試

2018-10-28 22:37:00

計(jì)數(shù)排序排序面試

2017-08-16 09:55:36

2024-06-12 13:54:37

編程語(yǔ)言字符串代碼

2021-01-22 10:09:23

簡(jiǎn)歷求職者面試

2015-02-13 10:42:31

前端工具Dreamweaver

2025-03-04 10:45:19

JVM內(nèi)存模型Java

2022-10-27 21:34:28

數(shù)據(jù)庫(kù)機(jī)器學(xué)習(xí)架構(gòu)

2020-03-30 17:20:54

B+樹(shù)SQL索引

2020-11-09 08:22:29

程序員 IT科技
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲九九 | 91久久精品日日躁夜夜躁国产 | 国产美女福利在线观看 | 婷婷色网 | 涩涩视频在线观看免费 | 嫩草视频网站 | 亚洲伊人久久综合 | a级在线免费观看 | 欧美精品一区二区三区四区 在线 | 精品一区二区三区在线观看国产 | 成人av一区 | 免费在线色 | 欧美一级二级在线观看 | com.色.www在线观看 | 国产999在线观看 | 精品免费观看 | 日韩免费av | 国产免费一区二区三区 | 日韩不卡三区 | 99爱在线| 爱综合| 国产精品免费一区二区三区 | 日韩a v在线免费观看 | 久久精品小视频 | 在线播放国产一区二区三区 | 91在线影院 | 福利国产 | 国产成人一区二 | 在线观看精品视频网站 | 在线亚洲欧美 | 成人综合视频在线观看 | 久久综合久久综合久久 | 91电影院| 99久热| 一级在线观看 | 欧美簧片 | 精品国产18久久久久久二百 | 欧美日韩高清一区 | 国内在线视频 | www.黄色片视频 | 成人欧美一区二区 |